avatar

目录
Flutter学习(6)route

Flutter学习系列是自己学习Flutter的过程笔记

路由

路由也是一个app不可或缺的一部分。当有多个不同的页面的,需要页面之间的跳转,就要用到路由了。

Flutter中的路由跳转有两种不同的方式:一种是引入页面的组件,直接导航到具体组件;一种是配置routes的路由名与页面组件之间的映射,然后跳转的时候指定相关路由名就能跳转到相关页面

组件跳转

关键讲解

点击相关按钮,跳转指定页面

  1. PageA是普通跳转

    dart
    1
    2
    3
    4
    5
    Navigator.of(context).push(
    MaterialPageRoute(
    builder: (context) => SearchPage()
    )
    )
  2. PageB是带参数的跳转:直接在实例化组件的时候传入相关参数

    dart
    1
    2
    3
    4
    5
    Navigator.of(context).push(
    MaterialPageRoute(
    builder: (context) => Detail(id: 3,)
    )
    )

完整示例

/lib/main.dart

dart
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
import 'package:flutter/material.dart';
import './PageA.dart';
import './PageBWithParam.dart';

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'demo',
home: Scaffold(
appBar: AppBar(
title: Text('demo'),
),
body: Body(),
),
);
}
}

class Body extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
RaisedButton(
child: Text('跳到PageA页面'),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SearchPage()
)
);
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary,
),
RaisedButton(
child: Text('跳到PageB页面'),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => Detail(id: 3,)
)
);
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary,
),
],
);
}
}

/lib/PageA.dart

dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import 'package:flutter/material.dart';

class SearchPage extends StatelessWidget {
const SearchPage({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
child: Scaffold(
appBar: AppBar(
title: Text('PageA'),
),
body: Text('PageA'),
),
);
}
}

/lib/PageBWithParam.dart

dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import 'package:flutter/material.dart';

class Detail extends StatelessWidget {
final int id;
const Detail({Key key, this.id = 1}) : super(key: key);

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PageBWithParam'),
),
body: Container(
child: Text('PageBWithParam,id:${this.id}'),
),
);
}
}

14b784fb677df2ed5.gif

路由名跳转

关键讲解

点击相关按钮,跳转指定页面

  1. MaterialApp组件下的routes属性可以定义app的路由

    dart
    1
    2
    3
    4
    routes: {
    '/pageA': (context) => PageA(),
    '/pageB': (context) => PageBWithParam(),
    },
  2. PageA是普通跳转

    dart
    1
    Navigator.pushNamed(context, '/pageA');
  3. PageB是带参数的跳转:参数需要通过arguments传递;ArgumentsType是PageBWithParam页面中定义的参数的类,相当于组件的参数接口

    dart
    1
    Navigator.pushNamed(context, '/pageB', arguments: ArgumentsType(id: 3));
    dart
    1
    2
    3
    4
    5
    6
    7
    8
    // PageBWithParam.dart 
    // 定义参数类型
    class ArgumentsType {
    final int id;
    ArgumentsType({ this.id });
    }
    // 接收参数
    final ArgumentsType args = ModalRoute.of(context).settings.arguments;

完整示例

/lib/main.dart

dart
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
import 'package:flutter/material.dart';
import './PageA.dart';
import './PageBWithParam.dart';

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'demo',
routes: {
'/pageA': (context) => PageA(),
'/pageB': (context) => PageBWithParam(),
},
home: Scaffold(
appBar: AppBar(
title: Text('demo'),
),
body: Body(),
),
);
}
}

class Body extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
RaisedButton(
child: Text('跳到PageA页面'),
onPressed: () {
Navigator.pushNamed(context, '/pageA');
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary,
),
RaisedButton(
child: Text('跳到PageB页面'),
onPressed: () {
Navigator.pushNamed(context, '/pageB', arguments: ArgumentsType(id: 3),);
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary,
),
],
);
}
}

/lib/PageA.dart

dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import 'package:flutter/material.dart';

class SearchPage extends StatelessWidget {
const SearchPage({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
child: Scaffold(
appBar: AppBar(
title: Text('PageA'),
),
body: Text('PageA'),
),
);
}
}

/lib/PageBWithParam.dart

dart
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
import 'package:flutter/material.dart';

// 参数类型
class ArgumentsType {
final int id;
ArgumentsType({ this.id });
}

class PageBWithParam extends StatelessWidget {
static String routeName = '/detail';

const PageBWithParam({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
// 接收参数
final ArgumentsType args = ModalRoute.of(context).settings.arguments;

return Scaffold(
appBar: AppBar(
title: Text('详情页'),
),
body: Container(
child: Text('这是详情页,id:${args.id}'),
),
);
}
}

14b784fb677df2ed5.gif

文章作者: 盛顺炎
文章链接: https://www.shengshunyan.xyz/2020/05/21/Flutter%E5%AD%A6%E4%B9%A0(6)route/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 果实的技术分享
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论