# 路由

返回:flutter

TIP

Flutter 路由管理中有两个非常重要的概念:

  • Route:路由是应用程序页面的抽象,对应 Android 中 Activity 和 iOS 中的 ViewController,由 Navigator 管理。
  • Navigator:Navigator 是一个组件,管理和维护一个基于堆栈的历史记录,通过 pushpop 进行页面的跳转

# 使用 maybePop,maybePop 只在路由堆栈有可弹出路由时才会弹出路由

RaisedButton(
  child: Text('A 页面'),
  onPressed: () {
    Navigator.of(context).maybePop();
  },
)
1
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

# 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

从 A 跳转到 B:

RaisedButton(
  child: Text('A 页面'),
  onPressed: () {
    Navigator.of(context).pushNamed('/B');
  },
)
1
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

B 通过 pushReplacementNamed 跳转到 C:

RaisedButton(
  child: Text('B 页面'),
  onPressed: () {
      Navigator.of(context).pushReplacementNamed('/C');
  },
)
1
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