在Flutter的嵌套导航器结构中,如何获得特定的导航器?
问题内容:
嵌套Navigator
s 时出现此问题。所以像
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
导航正确。什么是正确的方法?
另外,如何处理Navigator
我要访问的位置在Navigator
s 堆栈中间的情况?
问题答案:
大多数情况下,您只有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')