Tenho esse código dentro de um TextFormField que manipula a ida para a próxima caixa, mas só retorna quando a caixa de entrada estiver completa.
onChanged: (value) {
if (value.length == 1 && index < 5) {
FocusScope.of(context).nextFocus();
}
if ((controllers[index].text.isEmpty || value.isEmpty) &&
index > 0) {
FocusScope.of(context).previousFocus();
}
setState(() {});
},
Digamos que eu queira voltar no meio da digitação. Como posso fazer isso?
Estou assumindo que você está usando vários campos de texto para registrar cada caractere do otp, o problema é que como cada caixa de entrada do otp está vazia, o backspace não exclui nada, portanto, não dispara onChanged
para detectar um backspace, você pode inicializar um caractere em cada entrada, para que o backspace o exclua e acione onChanged , no meu caso usei um caractere de largura zero '\u2b' para que não fique visível para o usuário
Exemplo:
no código acima, otpInputWidget é a caixa de entrada individual, eu o inicializo com um listener focusNode para adicionar um caractere de largura zero sempre que estiver vazio para adicioná-lo novamente se ele tiver sido excluído antes.
Além disso, como a caixa de entrada agora tem um caractere, em vez de adicionar um caractere à entrada, queremos substituir o caractere existente por um novo, selecionando o texto para que a entrada o substitua, por isso tenho um _selectAllText() no ouvinte para selecionar o texto da entrada sempre que ele estiver focado.
definição de _selectAllText():
e para alternar o foco no campo de texto:
* você deve se lembrar de higienizar o otp completo final antes de enviá-lo para validação, removendo os caracteres extras de largura zero:
abaixo está o código completo: