Как стать автором
Обновить

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

Использовал globalKeys для создания двухуровневой навигации в приложении. Имеются табы в каждой из который свой набор роутов.При этом некоторые виджеты(роуты) могут отображаться в нескольких табах. Мне интересно кто как выкручивался, возможно уже есть решения для nested routes во флаттере? Все таки довольно распостраненный кейс.

  • Можно решать через of(context, rootNavigator: true/false)

  • Можно посмотреть на пакеты, которые работают с Navigator 2.0, например, routemaster (навигация будет описана в корне и потом просто пуш нужного роута)

routemaster вроде подходящее решение. Как нибудь попробую. Надеюсь что багов не будет) Самые проблемные места обычно это навигация вперед назад между табами.

Предположим, что вам необходимо, чтобы на экране с TabBarView каждый таб мог переходить на новый роут. Для этого можно обернуть каждый элемент TabBarView в Navigator, что позволит переходить по роутам каждому табу, не затрагивая глобальный роут.

TabBarView будет выглядеть следующим образом:

Переход на другие роуты внутри таба будет происходить так же, как обычно

Помимо прочего, ключи также сохраняют и восстанавливают текущую позицию прокрутки в списке виджетов.

Сами ключи этого не делают. Это происходит с их помощью

- ValueKey: ключ, использующий простое значение, например String.

- ObjectKey: ключ, который использует более сложный формат данных, а не примитивный тип данных, такой как String.

Примечание. Прежде чем использовать объект как ObjectKey, убедитесь, что он сравнивается корректно (сопоставим). Если нет, то необходимо переопределить оператор == и геттер hashCode, чтобы гарантировать, что любые два объекта этого класса, содержащие одни и те же данные, эквиваленты друг другу (оператор == вернет true)

ObjectKey сравнивает ссылки, а ValueKey использует оператор == для сравнения значений

  ReorderableListView(
    children: todos
        .map(
          ...
        )
        .toList(),

Это плохой пример использования виджета, так как модели мапятся в виджеты, которые могут быть никогда не нужны или если моделей очень много, то маппинг может занять много времени. Лучше использовать builder

  body: PageStorage(
    child: pages[currentTab],
    bucket: _bucket,
  ),

Каждый ModalRoute создаёт PageStorage. Возможно, этот лишний

Зарегистрируйтесь на Хабре, чтобы оставить комментарий