Comments 6
Использовал globalKeys для создания двухуровневой навигации в приложении. Имеются табы в каждой из который свой набор роутов.При этом некоторые виджеты(роуты) могут отображаться в нескольких табах. Мне интересно кто как выкручивался, возможно уже есть решения для nested routes во флаттере? Все таки довольно распостраненный кейс.
Можно решать через of(context, rootNavigator: true/false)
Можно посмотреть на пакеты, которые работают с Navigator 2.0, например, routemaster (навигация будет описана в корне и потом просто пуш нужного роута)
Предположим, что вам необходимо, чтобы на экране с TabBarView каждый таб мог переходить на новый роут. Для этого можно обернуть каждый элемент TabBarView в Navigator, что позволит переходить по роутам каждому табу, не затрагивая глобальный роут.
TabBarView будет выглядеть следующим образом:
Переход на другие роуты внутри таба будет происходить так же, как обычно
Ну я примерно так и делал. Вдохновлялся этой статьей https://codewithandrea.com/articles/multiple-navigators-bottom-navigation-bar/
Помимо прочего, ключи также сохраняют и восстанавливают текущую позицию прокрутки в списке виджетов.
Сами ключи этого не делают. Это происходит с их помощью
- ValueKey: ключ, использующий простое значение, например String.
- ObjectKey: ключ, который использует более сложный формат данных, а не примитивный тип данных, такой как String.
Примечание. Прежде чем использовать объект как ObjectKey, убедитесь, что он сравнивается корректно (сопоставим). Если нет, то необходимо переопределить оператор == и геттер hashCode, чтобы гарантировать, что любые два объекта этого класса, содержащие одни и те же данные, эквиваленты друг другу (оператор == вернет true)
ObjectKey сравнивает ссылки, а ValueKey использует оператор == для сравнения значений
ReorderableListView(
children: todos
.map(
...
)
.toList(),
Это плохой пример использования виджета, так как модели мапятся в виджеты, которые могут быть никогда не нужны или если моделей очень много, то маппинг может занять много времени. Лучше использовать builder
body: PageStorage(
child: pages[currentTab],
bucket: _bucket,
),
Каждый ModalRoute создаёт PageStorage. Возможно, этот лишний
Flutter: открытие виджетов ключами