Формы Flutter: несколько виджетов использовали один и тот же GlobalKey

Я видел множество сообщений с этой проблемой, но ни один из ответов не помог в моем случае (думаю, я тоже знаю, почему). У меня есть целевая страница в моем мобильном приложении Flutter, где пользователи могут зарегистрироваться, войти или попросить получить электронное письмо, чтобы получить свои < em> сброс пароля. Для каждой из этих функций у меня есть виджет Form. Каждой форме нужен ключ формы (GlobalKey<FormState>). Пользователи могут переключаться между формами благодаря IndexedStack. Ошибка, которую я получаю при переключении между формами:

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.

Теперь этот вопрос аналогичен, но решение не работает, потому что мне нужен ключи должны быть типа GlobalKey, потому что они являются ключами формы, и мне нужно, например, иметь возможность вызывать .validate(). Этот вопрос очень похож, но решение тоже не работает. Во-первых, OP показывает ошибку, когда оба виджета имеют разное описание; моя ошибка дает виджеты с таким же описанием.

Я попытался создать минимальный пример кода, но ошибка не совсем та. Выполнение этого фрагмента приводит к аналогичной ошибке:

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.

Я не уверен, почему это дает другую ошибку. Исходный код выполняет некоторую работу с пакетом provider, и там LandingPage является StatelessWidget. В любом случае не должно быть дубликатов GlobalKeys, поскольку страницы объявляются окончательными, и каждая страница использует свой уникальный ключ только один раз. Любая помощь приветствуется!


person Wessel    schedule 27.02.2021    source источник
comment
Я думаю, причина может заключаться в том, что вы объявляете свой GlobalKey как глобальную переменную, но у вас должен быть только один GlobalKey в дереве виджетов. Было бы лучше, если бы вы создали обратный вызов, в котором вы получаете значение формы на каждой из ваших страниц и возвращаете его в свой виджет LandingPage ().   -  person Antonin GAVREL    schedule 27.02.2021
comment
Но тогда я бы не смог выполнить функцию проверки для каждой формы отдельно, не так ли?   -  person Wessel    schedule 27.02.2021
comment
В качестве дополнения; удаление глобально определенных ключей и передача GlobalKey<FormState> непосредственно в качестве аргумента различным страницам приводит к той же ошибке   -  person Wessel    schedule 27.02.2021


Ответы (1)


Я сам решил проблему, поместив формы в Statefulwidgets вместо того, чтобы пытаться использовать какое-то управление состоянием провайдера. Должен был понять, что GlobalKey действительно требует состояния!

person Wessel    schedule 10.03.2021