Получить доступ к контексту InheritedWidget
У меня есть следующие настройки:
MaterialApp(home:SplashScreen)
SplashScreen(
///do some auth checks then
Navigator.of(context).push( MaterialPageRoute(
builder: (_) => StateInheritedWidget(
user: userData,
child: HomePage(),
)))
)
Тогда по моему HomePage
У меня есть FAB, который продвигает новый маршрут. Этот новый маршрут не имеет доступа к контексту моего унаследованного виджета.
Разве невозможно получить контекст InheritedWidget
на новых маршрутах или есть способ решить эту проблему?
Обновить
Это свойство моего конструктора MaterialApp
builder: (context,child){
///Doing some auth stuff here
return new StateInheritedWidget(
user: userData,
child: userData==null?const SplashScreen(child: const LoginPage(),):
const SplashScreen(child: const HomePage(),),
);
},
мой SplashScreen
метод сборки:
return !_load? new Scaffold(
body: new Center(
child: new Text('Splash'),
),
):this.widget.child;
Это ошибка, которую я получаю.
Первый, похоже, связан с Drawer
в моем HomePage
:
I/flutter (12688): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (12688): The following assertion was thrown building Tooltip("Open navigation menu", vertical offset: 24.0,
I/flutter (12688): position: below, dirty, state: _TooltipState#44ae9(ticker inactive)):
I/flutter (12688): No Overlay widget found.
I/flutter (12688): Tooltip widgets require an Overlay widget ancestor for correct operation.
I/flutter (12688): The most common way to add an Overlay to an application is to include a MaterialApp or Navigator
I/flutter (12688): widget in the runApp() call.
I/flutter (12688): The specific widget that failed to find an overlay was:
I/flutter (12688): Tooltip("Open navigation menu", vertical offset: 24.0, position: below)
I/flutter (12688):
Второе исключение появляется, когда я нажимаю на FAB (Navigator.push)
I/flutter (12688): Another exception was thrown: Navigator operation requested with a context that does not include a Navigator.
1 ответ
Нет, это невозможно (или, по крайней мере, не рекомендуется).
Проблема заключается в том, что ваш унаследованный виджет должен находиться не внутри маршрута, а над маршрутом. Обычно выше MaterialApp
Но я хочу, чтобы моя аутентификация могла выдвигать экран входа в систему, я не могу поставить его выше
MaterialApp
!
Вот почему я сказал usually
,:D
Аутентификация является одним из этих исключений. Возможно, вы захотите, чтобы ваш аутентичный слой имел доступ к навигатору. Но все же хочу поделиться этим достоверным слоем со всеми маршрутами.
Вот где полезное свойство MaterialApp
используется: builder
Когда пройдено, Builder будет использоваться для вставки любого вида виджетов прямо над вашими маршрутами. Но все же быть после Navigator
так что вы все еще можете проталкивать новые маршруты, когда это необходимо.
В конце концов, вы бы
new MaterialApp(
builder: (context, child) {
return new MyAuthent(child: child);
},
...
// home: SplashSceen ?
);
Это, скорее всего, требует рефакторинга с вашей стороны. Но это правильный способ достичь этого.