Flutter: diferença de TextField entre onEdittingComplete e onSubmitted

Sep 02 2020

Estou tentando descobrir a diferença entre onEdittingCompletee onSubmitted, não sei quando o último deve ser usado, pois o primeiro pode ser usado para mudar o foco ou para enviar o conteúdo do formulário.

Tentei consultar a documentação, mas não se fala muito sobre a onSubmittedpropriedade.

Respostas

3 jitsm555 Sep 01 2020 at 22:11

onSubmitted:

final ValueChanged<String> onSubmitted

Ele retorna o TextFieldvalor inserido no onSubmittedretorno de chamada, na maioria das vezes é usado para o botão de campo próximo / anterior do teclado ao usar TextInputAction.nexte TextInputAction.previouspara textInputActionexecutado.

onEditingComplete:

final VoidCallback onEditingComplete

É semelhante, onSubmittedmas não retorna o valor dentro do retorno de chamada; em vez disso, ele atualiza o texto controllere então podemos buscar um valor de controlleronde for necessário.

1 user1032613 Dec 07 2020 at 02:38

onSubmitted

Assim como o nome sugere, é chamado quando o usuário termina a edição, por exemplo, pressione "concluído" ou "enviar" no teclado. O retorno de chamada passa convenientemente o valor para você, para que você possa fazer sua lógica de negócios com ele. Ao mesmo tempo, como o Flutter assume que o usuário está "pronto", ele ocultará o teclado na tela.

onEditingComplete

Este é mais um "evento" que informa que o usuário terminou a edição. É disparado antes onSubmitted . Ele não passa o valor (embora seja possível obter o valor tecnicamente usando um controlador, essa não é a intenção aqui), porque você ainda pode manipular a lógica de negócios relacionada ao valor em onSubmitted. Ambos os eventos serão disparados de qualquer maneira.

O verdadeiro propósito por trás onEditingCompleteé que, na implementação padrão, o Flutter oculta o teclado na tela quando a ação do teclado é considerada uma ação de "conclusão", como "concluído", "ir", "enviar" ou "pesquisar", mas não oculta o teclado se a ação for "não concluída", como "próximo" ou "anterior". (A ação do teclado pode ser modificada por meio da textInputActionpropriedade do TextFieldwidget.)

Se você não gosta desse comportamento, deve modificá-lo. Por exemplo, "enviar" é considerado uma "ação de conclusão" aqui, portanto, em um aplicativo de mensagens instantâneas (bate-papo), cada vez que o usuário enviar uma mensagem curta, o teclado será recolhido, o que não é bom. Mas se substituirmos o onEditingCompleteretorno de chamada para uma função vazia, isso interromperá o comportamento padrão e não ocultará o teclado. Por exemplo:

TextField(
  controller: _controller,
  onSubmitted: (text) {
    sendMessage(text);
    _controller.clear();
  },
  onEditingComplete: () {},
  textInputAction: TextInputAction.send,
)

Demo: