一年前初学flutter,再次看以前知识有些生疏,当做笔记记之。
文章转载自CSDN
Navigator.push(context,new MaterialPageRoute(builder: (context) => new Second()));
- 在同一个 .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: () {
          //回到上一个页面 该pop将Route从导航器管理的路由栈中移除当前路径
          Navigator.pop(context);
        }),
      ),
    );
  }
}
如果不在同一页面中使用时候,
1
2
   Navigator.push(context,
        new MaterialPageRoute(builder: (context) => new LoginPage()));
这个时候需要在当前页面 import 对应的LoginPage()那个页面。
Navigator.of(context).pushNamed(“/loginin”);
- 需要在 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