Flutter: Différence TextField entre onEdittingComplete et onSubmitted

Sep 02 2020

J'essaie de comprendre la différence entre onEdittingCompleteet onSubmitted, je ne sais pas quand ce dernier doit être utilisé car le premier peut être utilisé pour changer de focus ou pour soumettre le contenu du formulaire.

J'ai essayé de consulter la documentation mais il n'y a pas grand chose à dire sur la onSubmittedpropriété.

Réponses

3 jitsm555 Sep 01 2020 at 22:11

onSoumis:

final ValueChanged<String> onSubmitted

Il renvoie la TextFieldvaleur entrée dans le onSubmittedrappel, la plupart du temps, elle est utilisée pour le bouton de champ suivant / précédent du clavier lors de l'utilisation TextInputAction.nextet TextInputAction.previouspour l' textInputActionexécution.

onEditingComplete:

final VoidCallback onEditingComplete

C'est similaire à onSubmittedmais ne retourne pas de valeur dans le rappel, au lieu de cela, il met à jour le texte controlleret nous pouvons ensuite récupérer une valeur à l' controllerendroit où cela est nécessaire.

1 user1032613 Dec 07 2020 at 02:38

onSoumis

Comme le nom suggère, il est appelé lorsque l'utilisateur a terminé l'édition, par exemple, appuyez sur «terminé» ou «envoyer» sur le clavier. Le rappel vous transmet la valeur de manière pratique, afin que vous puissiez utiliser votre logique métier. En même temps, puisque Flutter suppose que l'utilisateur a "terminé", il masquera le clavier à l'écran.

onEditingComplete

Il s'agit davantage d'un "événement" qui vous indique que l'utilisateur a terminé l'édition. Il est tiré avant onSubmitted . Il ne vous transmet pas la valeur (bien que vous puissiez techniquement obtenir la valeur à l'aide d'un contrôleur, ce n'est pas l'intention ici), car vous pouvez toujours gérer la logique métier liée à la valeur dans onSubmitted. Les deux événements se déclencheront de toute façon.

Le véritable objectif derrière onEditingCompleteest que, dans l'implémentation par défaut, Flutter masque le clavier à l'écran lorsque l'action du clavier est considérée comme une action de «fin», telle que «terminé», «aller», «envoyer» ou «rechercher», mais ne cache pas le clavier si l'action est "non-complétée", comme "suivant" ou "précédent". (L'action du clavier peut être modifiée via la textInputActionpropriété du TextFieldwidget.)

Si vous n'aimez pas ce comportement, vous devez le modifier. Par exemple, «envoyer» est considéré comme une «action de fin» ici, donc dans une application de messagerie instantanée (chat), chaque fois que l'utilisateur envoie un court message, le clavier sera réduit, ce n'est pas bon. Mais si nous remplaçons le onEditingCompleterappel par une fonction vide, cela arrêtera le comportement par défaut et ne masquera pas le clavier. Par exemple:

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

Démo: