Dans un TextFormField
, vous pouvez demander le focus en utilisant FocusScope.of (context) .requestFocus (_focusNode)
. Cependant, comment pouvez-vous vous assurer que le même nœud de focus n'a pas été focalisé?
Par exemple, dans mon flux de travail, je veux que hintText
soit X initialement, Y une fois focalisé, et reviens à X lorsqu'il n'est pas focalisé. Mais si j'utilise quelque chose d'habituel comme ce qui suit, je ne peux pas revenir à X.
class TextFormFieldErrorOnLabel extends StatefulWidget { final String hintText; final String hintTextOnFocus; const NewTextFormField({ this.hintText, this.hintTextOnFocus, }) : super(key: key); @override _NewTextFormFieldState createState() => _NewTextFormFieldState(); } class _NewTextFormFieldState { final FocusNode _focusNode = FocusNode(); void _requestFocus() { setState(() { FocusScope.of(context).requestFocus(_focusNode); }); } @override Widget build(BuildContext context) { return TextFormField( onTap: _requestFocus, focusNode: _focusNode, decoration: InputDecoration( hintText: _focusNode.hasFocus ? widget.hintTextOnFocus : widget.hintText, ) ); } }
Y a-t-il une méthode " requestUnfocus
" quelque part ? Si tel est le cas, comment l'appellerais-je à partir du TextFormField
?
3 Réponses :
Je ne sais pas si c'est la meilleure pratique, mais j'appelle
FocusScope.of(context).requestFocus(null);
pour m'assurer qu'aucun nœud n'est sélectionné.
Cela pourrait être un hack utile. Mais où appelez-vous ça? Dans l'écran qui contient les champs? Mais basé sur quoi? Comment appeler quelque chose en fonction d'un tap qui pas sur le champ précédemment ciblé?
Oui, c'est une bonne question. J'ai d'abord trouvé un moyen plus propre de supprimer le focus, c'est FocusScope.clear (context)
. Ensuite, je pense que vous devez envelopper l'intégralité de votre Scaffold
avec un GestureDetector et supprimer le focus au toucher si c'est ce que vous voulez.
Je vais bientôt étudier deux autres widgets à ce sujet: Focus
et FocusManager
.
A travaillé comme un homme de charme! L'autre .unfocus () ne fonctionnait pas correctement pour mon cas! Économiseur de jour!
J'ai rencontré le même problème, ce que j'ai fait, c'est d'avoir créé l'objet FocusNode ailleurs (de préférence dans la classe parent de la classe enfant) et de le passer en tant que variable, et d'envelopper le widget parent dans un appel GestureDetector et onTap, < pré> XXX
Si vous souhaitez perdre la mise au point lorsqu'un widget inaccessible est touché
placez GestureDetector
en haut de l'arborescence des widgets, sur le gestionnaire onTap
récupérez le FocusNode actuel avec FocusScope.of (context)
, après cette vérification pour voir si le FocusNode actuel a hasPrimaryFocus
, si ce n'est pas le cas, nous appelons unfocus ()
sur le nœud actuel pour supprimer le focus. Si vous essayez de déconcentrer ()
un nœud qui a actuellement le focus principal, Flutter lancera une exception.
le code ressemblera à ceci:
GestureDetector( onTap: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } }, child:... ),
crédits à ce type.
La classe
FocusNode
a une méthodeunfocus
. Maintenant, le défi où l'appeler.