Flutter-8.页面跳转路由

Flutter开发

Posted by 松下百合子 on March 28, 2019

一年前初学flutter,再次看以前知识有些生疏,当做笔记记之。

文章转载自CSDN

官网地址

  • 在同一个 .dart 文件中,定义两个page页面
  • 跳转到下一个页面:Navigator.push(context,new MaterialPageRoute(builder: (context) => new Second()));
  • 返回上一个页面:Navigator.pop(context);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';

/**
 * 跳转到新页面并返回
 */
void main() {
  runApp(new MaterialApp(
    title: "Flutter",
    home: new FirstScreen(),
  ));
}
/**
 * 第一个页面
 */
class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Flutter"),
      ),
      body: new Center(
        child: new RaisedButton(
            child: new Text("登录"),
            onPressed: () {
              //跳转到新的 页面我们需要调用 navigator.push方法
              Navigator.push(context,
                  new MaterialPageRoute(builder: (context) => new Second()));
            }),
      ),
    );
  }
}

/**
 * 第二个页面
 */
class Second extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Flutter"),
      ),
      body: new Center(
        //onPressed  点击事件
        child: new RaisedButton(child: new Text("注销"), onPressed: () {
          //回到上一个页面 popRoute从导航器管理的路由栈中移除当前路径
          Navigator.pop(context);
        }),
      ),
    );
  }
}

如果不在同一页面中使用时候,

1
2
   Navigator.push(context,
        new MaterialPageRoute(builder: (context) => new LoginPage()));

这个时候需要在当前页面 import 对应的LoginPage()那个页面。

  • 需要在 main.dart中进行添加key匹配,在别的页面才使用Navigator.of(context).pushNamed(“/loginin”);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import 'login_page.dart';
import 'newguide.dart';
import 'loginin_page.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // 定义路由
  final Map<String, WidgetBuilder> routes = {
    "/": (BuildContext context) => NewGuidePage(),
    "/home": (BuildContext context) => HomePage(),
    "/login": (BuildContext context) => LoginPage(),
    "/loginin": (BuildContext context) => LogininPage(),
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Tutorial',
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
        fontFamily: 'Nunito',
      ),
      debugShowCheckedModeBanner: false,
      routes: routes,
      initialRoute: '/',
    );
  }
}

命名路由

  • 所谓命名路由(Named Route)即给路由起一个名字,然后可以通过路由名字直接打开新的路由。这为路由管理带来了一种直观、简单的方式。

路由表

  • 要想使用命名路由,我们必须先提供并注册一个路由表(routing table),这样应用程序才知道哪个名称与哪个路由Widget对应。路由表的定义如下:

Map<String, WidgetBuilder> routes;

  • 它是一个Map, key 为路由的名称,是个字符串;value是个builder回调函数,用于生成相应的路由Widget。我们在通过路由名称入栈新路由时,应用会根据路由名称在路由表中找到对应的WidgetBuilder回调函数,然后调用该回调函数生成路由widget并返回。

注册路由表

  • 我们需要先注册路由表后,我们的Flutter应用才能正确处理命名路由的跳转。注册方式很简单,main.dart,在MyApp类的build方法中找到MaterialApp,添加routes属性,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
return new MaterialApp(
  title: 'Flutter Demo',
  theme: new ThemeData(
    primarySwatch: Colors.blue,
  ),
  //注册路由表
  routes:{
   "new_page":(context)=>NewRoute(),
  } ,
  home: new MyHomePage(title: 'Flutter Demo Home Page'),
);

通过路由名打开新路由页

  • 我们需要先注册路由表后,我们的Flutter应用才能正确处理命名路由的跳转。注册方式很简单,main.dart,在MyApp类的build方法中找到MaterialApp,添加routes属性,代码如下:
1
Future pushNamed(BuildContext context, String routeName)

资料

https://blog.csdn.net/yuezheyue123/article/details/84315157