Mise à jour de l'état après un retour sur une view

Hello tout le monde,

Malgré le coaching d’hier soir, il me reste un micro problème à gérer pour mon widget de recherche. Je veux afficher une croix d’effacement à partir du moment où le focus est sur mon TextField. Voici mon code :

                   TextField(
                      controller: _controller,
                      focusNode: focusNode,
                      decoration: InputDecoration(
                          prefixIcon: const Icon(Icons.search),
                          suffixIcon:
                              focusNode.hasFocus
                                  ? IconButton(
                                      icon: const Icon(Icons.clear),
                                      onPressed: _clearTextField,
                                    )
                                  : null,
                          labelText: "Chercher un champignon",
                          //hintText: "Chercher un champignon",
                          border: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(15),
                              borderSide:
                                  const BorderSide(color: Colors.orange))),
                      onTap: () {
                        setState(() {});
                      },
                      onChanged: (searchText) {
                        widget._viewModel.fungiSearch(searchText: searchText);
                        setState(() {});
                      },
                    ),

Au niveau du suffixIcon, j’ai une condition d’affichage si le focus est sur le champs. Le focus est bien détecté, lorsque je tap ou change le champs texte.
Mais si je renseigne mon champs recherche et que je clique sur un résultat je navigue vers une autre page. Lorsque j’appuie sur le bouton retour, je retourne dans ma vue initiale, le texte de ma recherche est toujours là et mon focus bien en place dans le Textfield. Je devrais donc afficher ma croix mais elle reste masquée parce que je n’ai pas mis à jour mon état.
Si je clique sur le champs ou que je bouge mon contenu, a ce moment mon état ce met à jour et la croix apparait.

Comment puis-je faire pour mettre à jour mon état lors d’un retour sur ma vue opéré par le navigateur 2.0 ?

Merci d’avance pour votre aide !

tu veux dire que quand tu reviens en arrière, ton focusNode.hasFocus ne reflète pas la réalité ? Ou tu n’y passes même pas (à tester avec le deboggeur) ?

Je vais retester avec le debugger mais j’ai l’impression que non. Je te dis ça demain :grinning:

Hello @mbritto,
J’ai beau mettre des points d’arrêt partout sur le Textfield, le suffixIcon, l’icon, le déboggeur ne s’arrête jamais même en fonctionnement normal donc je ne sais pas vraiment si au retour sur cette vue si l’écran est reconstruit ou juste réafficher dans son état précédent …

J’ai tenté de gérer moi même la gestion du champs texte mais je n’ai pas trouvé comment gérer le focus sans passer par le focusNode. Mais j’ai quand même réussi à trouver une solution à mon problème :slight_smile:
J’ai encapsulé mon Textfield par le widget Focus et j’ai utilisé la propriété onFocusChange pour forcer l’état à se mettre à jour.
Ca corrige le bug natif de Flutter !!

                        child: Focus(
                          onFocusChange: (hasFocus) {
                            setState(() {});
                          },
                          child: TextField(
                            controller: _controller,
                            focusNode: focusNode,
 
2 « J'aime »

Bien joué @Tazooou !

1 « J'aime »