Проблема с маршрутизацией флаттера и дублированием глобального ключа

#flutter #flutter-routes

Вопрос:

У меня проблема с маршрутами флаттера и дубликатом глобального ключа в дереве виджетов.

Мое приложение выполняет следующие действия:

 Screen_A -gt; Screen_B -gt; Screen_C  

В каждом случае навигация (-gt;) выполняется с помощью следующего (где * — B или C):

 Navigator.push(context, MaterialPageRoute(builder: (context) =gt; Screen_*()));  

Затем я перехожу с Screen_C -gt; Screen_A помощью:

 Navigator.pushAndRemoveUntil(context,   MaterialPageRoute(builder: (context) =gt; Screen_A()),   (Routelt;dynamicgt; route) =gt; false);  

Наконец, я перехожу от Screen_A -gt; Screen_B использования оригинального Navigator.push метода. Я получаю следующую ошибку:

«пакет:flutter/src/виджеты/will_pop_scope.dart»: Неудачное утверждение: строка 135 pos 12: «маршрут == ModalRoute.of(контекст)»: неверно.

Исключение, обнаруженное библиотекой виджетов: в дереве виджетов обнаружен дубликат глобального ключа.

Для справки, Screen_B это форма, в которой я определяю глобальный ключ с помощью:

 GlobalKeylt;FormStategt; formKey = GlobalKeylt;FormStategt;();  

Я не могу понять, почему это происходит. Он появляется там, где я определяю глобальный ключ и как я правильно прокладываю маршрут. Не следует ли Navigator.pushAndRemoveUntil удалить историю стека маршрутов, тем самым удалив старый глобальный ключ Screen_B ?

Комментарии:

1. Если вы переходите от C к A в конце, почему бы вам не использовать pushReplacement() вместо push() перехода от A к B и от B к C

2. Сбрасывает ли pushReplacement() стек навигации?

3. Он удаляет экран из стека

Ответ №1:

решенный: Решение оказалось там, где я помещал декларацию GlobalKey. Раньше у меня это было за пределами виджета с отслеживанием состояния, вот так:

 GlobalKeylt;FormStategt; formKey = GlobalKeylt;FormStategt;(); class Screen_B extends StatefulWidget { (etc.) } class _Screen_B extends Statelt;Screen_B gt; { (etc.) }  

Но после перевода его в состояниеlt;Screen_Bgt; моя проблема была решена. Вот так:

 class Screen_B extends StatefulWidget { (etc.) } class _Screen_B extends Statelt;Screen_B gt; {   GlobalKeylt;FormStategt; formKey = GlobalKeylt;FormStategt;();  (etc.)  }  

===== Кроме того, как отметил икерфа выше, использование функции pushReplacement() также сработало бы с помощью Screen_A -gt; Screen_B -gt;gt; Screen_C.