Обнаружение флаттера, когда навигатор готов

#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. Я понимаю, почему вы хотите выполнить все на экране загрузки. Однако мне нужно подключить навигатор к прослушивателю на уровне приложения. Я не могу сделать это на экране загрузки, потому что позже он будет удален, и я не буду получать никаких обновлений