J'ai vu de nombreux articles sur ce problème, mais aucune des réponses n'a fonctionné dans mon cas (je pense que je sais pourquoi aussi). J'ai une page de destination dans mon application mobile Flutter où les utilisateurs peuvent s'inscrire , se connecter ou demander à recevoir un e-mail pour obtenir leur < em> réinitialisation du mot de passe . Pour chacune de ces fonctionnalités, j'ai un widget Form. Chaque formulaire a besoin d'une clé de formulaire (un GlobalKey<FormState>). Les utilisateurs peuvent basculer entre les formulaires grâce à un IndexedStack. L'erreur que je reçois lors du passage d'un formulaire à un autre est la suivante:

The following assertion was thrown while finalizing the widget tree:
Multiple widgets used the same GlobalKey.

The key [LabeledGlobalKey<FormState>#eebb6] was used by multiple widgets. The parents of those widgets were different widgets that both had the following description:
  RegisterPage(dependencies: [_LocalizationsScope-[GlobalKey#f7403], _InheritedProviderScope<LandingPageModel>, _InheritedTheme])
A GlobalKey can only be specified on one widget at a time in the widget tree.

Maintenant, cette question est similaire mais la solution ne fonctionne pas car j'ai besoin du les clés doivent être du type GlobalKey, car ce sont des clés de formulaire et je dois pouvoir appeler .validate(), par exemple. Cette question est très similaire, mais le la solution ne fonctionne pas non plus. D'une part, l'OP affiche une erreur où les deux widgets ont une description différente; mon erreur donne des widgets avec la même description.

J'ai essayé de créer un exemple de code minimal, mais l'erreur n'est pas tout à fait la même. L'exécution de cet extrait génère une erreur similaire:

Duplicate GlobalKeys detected in widget tree.

The following GlobalKeys were specified multiple times in the widget tree. This will lead to parts of the widget tree being truncated unexpectedly, because the second time a key is seen, the previous instance is moved to the new location. The keys were:
- [LabeledGlobalKey<FormState>#a86c7]
  [LabeledGlobalKey<FormState>#c46a1]
  [LabeledGlobalKey<FormState>#1b7fd]
This was determined by noticing that after widgets with the above global keys were moved out of their respective previous parents, those previous parents never updated during this frame, meaning that they either did not update at all or updated before the widgets were moved, in either case implying that they still think that they should have a child with those global keys.
The specific parents that did not update after having one or more children forcibly removed due to GlobalKey reparenting are:
- ColoredBox(color: MaterialColor(primary value: Color(0xffff9800)), renderObject: _RenderColoredBox#8c966 relayoutBoundary=up6 NEEDS-PAINT)
  ColoredBox(color: MaterialColor(primary value: Color(0xff2196f3)), renderObject: _RenderColoredBox#73e9a relayoutBoundary=up6 NEEDS-PAINT)
  ColoredBox(color: MaterialColor(primary value: Color(0xff9e9e9e)), renderObject: _RenderColoredBox#dcb58 relayoutBoundary=up6)
A GlobalKey can only be specified on one widget at a time in the widget tree.

Je ne sais pas pourquoi cela donne une erreur différente. Le code d'origine fonctionne avec le package provider, et là, le LandingPage est un StatelessWidget. Dans tous les cas, il ne doit pas y avoir de GlobalKeys en double car les pages sont déclarées comme finales et chaque page n'utilise sa clé unique qu'une seule fois. Toute aide est appréciée!

0
Wessel 27 févr. 2021 à 19:36

1 réponse

Meilleure réponse

J'ai résolu le problème moi-même en mettant les formulaires dans Statefulwidgets au lieu d'essayer d'utiliser une gestion de l'état des fournisseurs. J'aurais dû réaliser qu'une GlobalKey nécessite vraiment un état!

0
Wessel 10 mars 2021 à 09:58