1
votes

Comment supprimer le focus de `FocusNode` dans un champ de texte (formulaire) dans Flutter

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?


1 commentaires

La classe FocusNode a une méthode unfocus . Maintenant, le défi où l'appeler.


3 Réponses :


1
votes

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é.


4 commentaires

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!



0
votes

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


0 commentaires

0
votes

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.


0 commentaires