# 路由
TIP
Flutter 路由管理中有两个非常重要的概念:
- Route:路由是应用程序页面的抽象,对应 Android 中 Activity 和 iOS 中的 ViewController,由 Navigator 管理。
- Navigator:Navigator 是一个组件,管理和维护一个基于堆栈的历史记录,通过
push和pop进行页面的跳转
# 使用 maybePop,maybePop 只在路由堆栈有可弹出路由时才会弹出路由
RaisedButton(
child: Text('A 页面'),
onPressed: () {
Navigator.of(context).maybePop();
},
)
1
2
3
4
5
6
2
3
4
5
6
RaisedButton(
child: Text('B 页面'),
onPressed: () {
if(Navigator.of(context).canPop()){
Navigator.of(context).pop();
}
},
)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# pushNamed
pushNamed 是命名路由的方式,需要在 MaterialApp 中配置路由名称:
MaterialApp(
title: 'Flutter Demo',
routes: <String, WidgetBuilder>{
'/A': (context) => APage(),
'/B': (context) => BPage(),
},
home: Scaffold(
body: APage(),
),
)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
从 A 跳转到 B:
RaisedButton(
child: Text('A 页面'),
onPressed: () {
Navigator.of(context).pushNamed('/B');
},
)
1
2
3
4
5
6
2
3
4
5
6
pushReplacementNamed 和 popAndPushNamed 有 A、B、C 三个页面,A 页面通过 pushNamed 跳转到 B:
RaisedButton(
child: Text('A 页面'),
onPressed: () {
Navigator.of(context).pushNamed('/B');
},
)
1
2
3
4
5
6
2
3
4
5
6
B 通过 pushReplacementNamed 跳转到 C:
RaisedButton(
child: Text('B 页面'),
onPressed: () {
Navigator.of(context).pushReplacementNamed('/C');
},
)
1
2
3
4
5
6
2
3
4
5
6
点击 C 页面按钮执行 pop:回到A
RaisedButton(
child: Text('C 页面'),
onPressed: () {
if(Navigator.of(context).canPop()){
Navigator.of(context).pop();
}
},
)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10