Comments 9
Спасибо за статью! Стоит отметить, что у go_router очень изменчивое api от версии к версии, которое пока что не стабилизировалось. Но пакет сильно значимый. Хочется верить, что получится учесть прошлый костыльный опыт по навигации и сделать favorite-пакет (я не про плашку в pub.dev)
StatefulShellRoute на самом деле кривоватый. Пример:
Есть экран "1" с TextField, на котором висит onTapOutside
Есть экран "2" в другой branch, на котором также находится TextField
Мы переходим с экрана 1 на экран 2 через context.go() (т.е. в backstack экрана 1 нет)
Нажатия по экрану 2 вызывают onTapOutside с экрана 1
Вопрос: А как так? StatefulShellBranch просто держит состояние активным?
Из-за данной проблемы вернулся на обычный ShellRoute.
Идея StatefulShellRoute хорошая, но его допиливать надо. А если я хочу, чтобы не все экраны были в StatefulShellBranch. Иногда хочется что-то вроде StatelessShellBranch.
Вообще, goRouter - очень крутая либа с классными фичами (refreshListanable, redirect и т.д.), всегда с её помощью навигацию строю. Но StatefullShellRoute, вышедший несколько месяцев назад, ещё сырой. Я бы рекомендовал воздержаться от его использования в больших проектах, мало ли что.
Хорошее замечание, мне такой кейс не встречался
А можете по подробнее расписать, для какой логики вы используете onTapOutside?
TextField находится в DraggableScrollableSheet, и нужно вызывать unfocus() в onTapOutside, чтобы при взаимодействии с DraggableScrollableSheet клавиатура убиралась.
А когда я использовал StatefullShellRoute, при нажатии на TextField (и всё остальное) на экране 2 сразу происходил unfocus :-)
Добавил debugPrint() в onTapOutside и увидел, что в он вызывается, хотя экран даже не в backstack.
Как-то так.
Вероятно появилось решение проблемы https://github.com/flutter/flutter/issues/129581
Вышло в версии https://pub.dev/packages/go_router/changelog#1010
После того как намучился с пакетами навигации (go router, routemaster, auto route), написал свой пакет. Пару недель на разработку зато все мои юз кейсы, которые неработали в других пакетах + стандартные кейсы работают как надо и покрыты тестами. Уж лучше так чем годами ковырятся с багами из за навигации кривой.
Вложенная навигация во Flutter: что такое декларативный роутер и зачем он нужен