我正在尝试在onTap中启动一个新屏幕,但是我收到以下错误:
请求导航器操作的上下文不包含导航器.
我用来导航的代码是:
onTap: () { Navigator.of(context).pushNamed('/settings'); },
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序中设置了一条路线,如下所示:
routes: <String, WidgetBuilder>{
'/settings': (BuildContext context) => new SettingsPage(),
},
Run Code Online (Sandbox Code Playgroud)
我试图使用stocks示例应用程序复制代码.我查看了Navigator和Route文档,但无法弄清楚如何将上下文包含在Navigator中.的context在使用的onTap感从传递到构建方法中的参数引用:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Run Code Online (Sandbox Code Playgroud)
SettingsPage是一个类,如下所示:
class SettingsPage extends Navigator {
Widget buildAppBar(BuildContext context) {
return new AppBar(
title: const Text('Settings')
);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: buildAppBar(context),
);
}
}
Run Code Online (Sandbox Code Playgroud) 以前使用时MaterialApp有一种方法可以GlobalContext使用NavigatorKey位于MaterialApp widget.
然而现在看来这种替代方案不再可能了,我有这个结构,如下Navigator 2.0
Widget build(BuildContext context, WidgetRef ref) {
return MaterialApp.router(
debugShowCheckedModeBanner: false,
restorationScopeId: 'app',
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
onGenerateTitle: (BuildContext context) =>
AppLocalizations.of(context)!.appTitle,
routeInformationParser: const RoutemasterParser(),
routeInformationProvider: routeInformationProvider,
routerDelegate: introductionRouteMap(context, ref));
}
Run Code Online (Sandbox Code Playgroud)
现在没有任何 NavigatorKey。所以我的问题是,如何使用设置 GlobalContext MaterialApp.router?
目前,仅仅因为必须在其中传递上下文,就非常忙于从应用程序中的任何代码层显示对话框。因此我想通过 navigatorKey.currentContext (导航键是传递给 Material app navigatorKey 参数的全局键)来显示对话框。但我得到了错误
“使用不包含导航器的上下文请求的导航器操作。用于从导航器推送或弹出路由的上下文必须是作为导航器小部件后代的小部件的上下文。”
问题是 showDialog 在内部调用 Navigator.of(context) 并查找导航器祖先,该祖先当然会返回 null,因为导航器本身就是根。因此它不会找到作为祖先的导航器。
有没有办法可以直接将导航器状态/上下文传递给 showDialog 函数来显示对话框?或者,如果我们想从 bloc 显示它,是否有更简单的方法来显示 Dialog 而不将上下文传递给它?
flutter ×3