#flutter #dart
#флаттер #дротик
Вопрос:
Работая над приложением Flutter, я обрабатываю глубокие ссылки с помощью SDK, для которого мне предоставлен слушатель, который я должен обработать, как только приложение запустится, следовательно, в main()
.
Как только глубокая ссылка получена, я должен перейти к соответствующему экрану на основе параметров, переданных по данным глубокой ссылки.
Поскольку я получаю глубокую ссылку в основной функции, я оторван от контекста приложения, поэтому для доступа к NavigatorState
я использовал навигационный синглтон с GlobalKey
переданным моему CupertinoApp
navigatorKey
. Позже я использую этот ключ для извлечения NavigatorState
и вызова push. (вместо Navigator.of(context)...
.
Однако, если открыть приложение по глубокой ссылке, очень вероятно, что navigatorKey
ничего не содержит (пока).
Как я могу обнаружить / дождаться, пока навигатор не будет готов?
На данный момент мой подход заключается в добавлении WidgetsBinding.instance.addPostFrameCallback
в мои App
initState
, который разрешает обещание указать, когда можно использовать GlobalKey
указание на NavigatorState
… Я уверен, что есть лучший способ добиться этого.
Комментарии:
1. Просто установите
initialRoute
для вашегоMaterialApp
значения из вашей глубокой ссылки, и он перейдет к этому маршруту при сборке.
Ответ №1:
Для этого я создаю initialRoute в качестве экрана загрузки и выполняю всю свою логику внутри него, таким образом, у меня могут быть разные initialRoutes, и мне не нужно беспокоиться об отсутствии MediaQuery, или Navigator, или даже ThemeData.
Однако в вопросе указан способ узнать, доступен ли навигатор, для этого я бы использовал builder
функцию MaterialApp / WidgetsApp / CupertinoApp, она используется для переопределения настроек навигатора, хотя я использую ее для добавления штриховки и глобального цвета фона и даже переопределения виджета навигатора пользовательским,
CupertinoApp(
...
builder: (context, child){
//The navigator is ready
Future.delayed(Duration.zero,
() => print(navigatorKey.currentContext)); //We use a delayed since the child needs to be returned first. It's kinda like a hack 7u7
return child;
}
Комментарии:
1. Я понимаю, почему вы хотите выполнить все на экране загрузки. Однако мне нужно подключить навигатор к прослушивателю на уровне приложения. Я не могу сделать это на экране загрузки, потому что позже он будет удален, и я не буду получать никаких обновлений