嵌套Navigators 时出现此问题。所以像
Navigator
class App extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), initialRoute: "/", routes: { '/': (context) => SomeOneView(), '/two': (context) => SomeTwoView(), '/three': (context) => SomeThreeView(), }, ); } } class SomeOneView extends StatefulWidget { @override _SomeOneViewState createState() => _SomeOneViewState(); } class _SomeOneViewState extends State<SomeOneView> { @override Widget build(BuildContext context) { return Container( width: double.infinity, height: double.infinity, color: Colors.indigo, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ MaterialButton( color: Colors.white, child: Text('Next'), onPressed: () => Navigator.of(context).pushNamed('/two'), ), ], ), ); } } class SomeTwoView extends StatefulWidget { @override _SomeTwoViewState createState() => _SomeTwoViewState(); } class _SomeTwoViewState extends State<SomeTwoView> { @override Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { // Some implementation }, child: Navigator( initialRoute: "two/home", onGenerateRoute: (RouteSettings settings) { WidgetBuilder builder; switch (settings.name) { case "two/home": builder = (BuildContext context) => HomeOfTwo(); break; case "two/nextpage": builder = (BuildContext context) => PageTwoOfTwo(); break; } return MaterialPageRoute(builder: builder, settings: settings); }, ), ); } } class HomeOfTwo extends StatelessWidget { @override Widget build(BuildContext context) { return Container( width: double.infinity, height: double.infinity, color: Colors.white, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ MaterialButton( color: Colors.white, child: Text('Next'), onPressed: () => Navigator.of(context).pushNamed('two/nextpage'), ), ], ), ); } } class PageTwoOfTwo extends StatelessWidget { @override Widget build(BuildContext context) { return Container( width: double.infinity, height: double.infinity, color: Colors.teal, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ MaterialButton( child: Text('Next'), onPressed: () => Navigator.of(context).pushNamed('/three'), ), ], ), ); } }
如您所见,我从Navigator提供的“最热门”开始导航,然后转到MaterialApp孩子Navigator的'two/nextpage',然后转到MaterialApp '/three'。问题在于,这样做onPressed: () => Navigator.of(context).pushNamed('/three'),返回Navigator的电流context是孩子Navigator。我需要访问MaterialApp的Navigator导航正确。什么是正确的方法?
MaterialApp
'two/nextpage'
'/three'
onPressed: () => Navigator.of(context).pushNamed('/three'),
context
另外,如何处理Navigator我要访问的位置在Navigators 堆栈中间的情况?
大多数情况下,您只有2个导航器。
这意味着要获取嵌套的,请执行以下操作:
Navigator.of(context)
并获取根目录,请执行以下操作:
Navigator.of(context, rootNavigator: true)
对于更复杂的体系结构,到目前为止,最简单的方法是使用GlobalKey(因为在 构建 过程中您永远不会阅读Navigators )
final GlobalKey<NavigatorState> key =GlobalKey(); final GlobalKey<NavigatorState> key2 =GlobalKey(); class Foo extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( navigatorKey: key, home: Navigator( key: key2, ), ); } }
然后可以使用这种方式:
key.currentState.pushNamed('foo')