Dans le projet Flutter, j'ai besoin d'écouter le texte d'entrée dans TextFormField et de faire certaines actions, en particulier lorsque l'utilisateur met du caractère (par exemple, de l'espace) dans ce fichier ou lorsqu'il demande le focus. Lorsque ce type d'événement se produit, je dois modifier la valeur du dossier. Je sais qu'il y a une propriété called controller
mais je ne sais pas comment l'utiliser dans ce cas.
Merci d'avance.
Vous pouvez spécifier un contrôleur et un nœud de focus, puis leur ajouter des écouteurs pour surveiller les modifications.
Ex:
Définir des contrôleurs et des nœuds de focus
TextEditingController _controller = new TextEditingController();
FocusNode _textFocus = new FocusNode();
Définir la fonction d'écoute
void onChange(){
String text = _controller.text;
bool hasFocus = _textFocus.hasFocus;
//do your text transforming
_controller.text = newText;
_controller.selection = new TextSelection(
baseOffset: newText.length,
extentOffset: newText.length
);
}
Ajouter un listner au contrôleur et au focusnode à initState
// you can have different listner functions if you wish
_controller.addListener(onChange);
_textFocus.addListener(onChange);
Ensuite, vous pouvez l'utiliser comme
new TextFormField(
controller: _controller,
focusNode: _textFocus,
)
J'espère que ça t'as aidé!
Si vous essayez simplement de transformer l'entrée en un autre formulaire dans TextFormField, vous feriez mieux d'utiliser "TextInputFormatter". L'utilisation d'un écouteur avec TextController provoque de nombreux problèmes. Jetez un oeil à mon exemple de code pour voir si cela vous aide. btw, La dernière ligne de code tente simplement de déplacer le curseur à la fin du texte.
TextFormField(inputFormatters: [QuantityInputFormatter()])
class QuantityInputFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
final intStr = (int.tryParse(newValue.text) ?? 0).toString();
return TextEditingValue(
text: intStr, selection: TextSelection.collapsed(offset: intStr.length),);
}
}