一、直接跳转路由

push

使用 Navigator.push 跳转到新页面:

  1. Navigator.push(context,
  2. new MaterialPageRoute(builder: (context) {
  3. return new NewRoute(); // 将给定的路由入栈
  4. }));
  • context: build 中传入的 content
  • Navigator: Navigator 是一个路由管理的组件,它提供了打开和退出路由页方法。Navigator 通过一个栈来管理活动路由集合。通常当前屏幕显示的页面就是栈顶的路由。
  • MaterialPageRoute: MaterialPageRoute 继承自 PageRoute 类,PageRoute 类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面,它还定义了路由构建及切换时过渡动画的相关接口及属性。

MaterialPageRoute 的定义:

  1. MaterialPageRoute({
  2. WidgetBuilder builder,
  3. RouteSettings settings,
  4. bool maintainState = true,
  5. bool fullscreenDialog = false,
  6. })

如果要替换当前页面,可以使用: Navigator.pushReplacement

pop

回退到前一个页面使用 Navigator.pop

  1. Navigator.pop(context); // 将栈顶路由出栈

of

还可以通过 Navigator.of(context).push 进行页面跳转:

  1. Navigator.of(context).push(
  2. new MaterialPageRoute(
  3. builder: (context) {
  4. return new Scaffold(
  5. appBar: new AppBar(
  6. title: new Text('NewPage'),
  7. ),
  8. body: new Text('...'),
  9. );
  10. },
  11. ),
  12. );

同样,可以使用以下方式返回前一个页面:

  1. Navigator.of(context).pop();

示例:两个页面之间的跳转

  1. class HomePage extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return Scaffold(
  5. floatingActionButton: FloatingActionButton(
  6. onPressed: () {
  7. Navigator.push(context,
  8. new MaterialPageRoute(builder: (context) {
  9. return new NewPage();
  10. }));
  11. },
  12. child: Icon(Icons.forward),
  13. ),
  14. // ...
  15. );
  16. }
  17. }
  18. class NewPage extends StatelessWidget {
  19. @override
  20. Widget build(BuildContext context) {
  21. return Scaffold(
  22. floatingActionButton: FloatingActionButton(
  23. onPressed: () {
  24. Navigator.pop(context);
  25. },
  26. child: Icon(Icons.arrow_back),
  27. ),
  28. // ...
  29. );
  30. }
  31. }

二、命名路由

路由表

通过 MaterialApp 的 routes 参数指定路由表

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(new MyApp());
  3. class MyApp extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return new MaterialApp(
  7. debugShowCheckedModeBanner: false,
  8. title: 'Flutter_ScreenUtil',
  9. theme: new ThemeData(
  10. primarySwatch: Colors.blue,
  11. ),
  12. // 注册路由表
  13. routes: {
  14. "HomePage": (context) => HomePage(),
  15. "NewPage": (context) => NewPage(),
  16. },
  17. home: new HomePage(),
  18. );
  19. }
  20. }

通过 Navigator.pushNamed 跳转到命名路由

  1. Navigator.pushNamed(context, 'NewPage');

同样,可以使用 of 指定 context:

  1. Navigator.of(context).pushNamed('NewPage');

如果要替换当前页面,可以使用: Navigator.pushReplacementNamed

多级路由

可以使用以下方式定多级路由:

  1. return new MaterialApp(
  2. // ...
  3. routes: <String, WidgetBuilder> {
  4. // 这里可以定义静态路由,不能传递参数
  5. '/router/second': (_) => new SecondPage(),
  6. '/router/home': (_) => new RouterHomePage(),
  7. },
  8. );

使用:

  1. Navigator.of(context).pushNamed('/router/second');

三、路由传参

构造器传参

通过 push 方法传递参数:

  1. Navigator.push(context,
  2. new MaterialPageRoute(builder: (context) {
  3. return new NewPage(text: 'Hello'); // 传入text参数
  4. }));

然后通过类的构造器接收参数:

  1. class NewPage extends StatelessWidget {
  2. NewPage({
  3. Key key,
  4. @required this.text, // 接收一个text参数
  5. }) : super(key: key);
  6. final String text;
  7. @override
  8. Widget build(BuildContext context) {
  9. return Scaffold(
  10. appBar: AppBar(
  11. title: Text('New Page'),
  12. ),
  13. body: Text(text), // 显示传入的参数
  14. );
  15. }
  16. }

通过路由参数传递

在 MaterialPageRoute 中接收第二参数 settings,可以通过 arguments 指定要传入的参数:

  1. Navigator.push(context,
  2. new MaterialPageRoute(
  3. builder: (context) {
  4. return new NewPage();
  5. },
  6. settings: RouteSettings(
  7. arguments: {'name': 'postbird'}, // 传入参数
  8. ),
  9. ),
  10. );

接收参数:

  1. class NewPage extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. var args = ModalRoute.of(context).settings.arguments;
  5. return Scaffold(
  6. // ...
  7. );
  8. }
  9. }

回传参数

在 pop 方法中可以携带返回参数,通过 push 的 then 接收:

  1. Navigator.push(context,
  2. new MaterialPageRoute(builder: (context) {
  3. return new NewPage();
  4. }
  5. ),
  6. ).then((res) { // 接收返回时传过来的参数
  7. print(res);
  8. });

接收参数:

  1. // 接参
  2. class NewPage extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. floatingActionButton: FloatingActionButton(
  7. onPressed: () {
  8. Navigator.pop(context, '这个是要返回给上一个页面的数据'); // 返回时传递参数
  9. },
  10. child: Icon(Icons.arrow_back),
  11. ),
  12. // ...
  13. );
  14. }
  15. }

命名路由传参

通过 pushNamed 可以携带第三参数:

  1. Navigator.pushNamed(context, 'NewPage', arguments: 'Hello world');

接收参数:

  1. // 接参
  2. class NewPage extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. var args = ModalRoute.of(context).settings.arguments; // 获取传入的参数
  6. return Scaffold(
  7. // ...
  8. );
  9. }
  10. }

返回时传参同样用 then 接收:

  1. // NewPage
  2. Navigator.of(context).pop('返回的数据');
  1. // 返回的页面
  2. Navigator.pushNamed(context, 'NewPage').then((res) {
  3. showDialog(
  4. context: context,
  5. builder: (BuildContext context) {
  6. return new AlertDialog(
  7. content: new Text("res: $res"),
  8. );
  9. });
  10. });