#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 к C2. Сбрасывает ли 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.