说明
整个练习总共就下面就四个文件,因为dart的静态变量不知道啥原因取不到值。所以这里参考示例将路由的配置单独拎出个文件。
文件名 | 作用 |
---|---|
main.dart | 用来启动程序和初始化路由配置 |
page_one.dart | 第一个界面 |
page_two.dart | 第二个界面 |
routes.dart | 路由的配置类 |
在routes.dart文件中配置路由,这里需要注意的事首页一定要用“/”配置,其它页无所谓。
import 'package:fluro/fluro.dart';
import 'package:ui_test_no4/page_one.dart';
import 'package:ui_test_no4/page_two.dart';
class Routes {
static Router router;
static String page1 = '/';
static String page2 = '/page2';
static void configureRoutes(Router router) {
router.define(
page1, handler: Handler(handlerFunc: (context, params) => Page1()));
router.define(
page2, handler: Handler(handlerFunc: (context, params) {
var message = params['message']?.first;//取出传参
return Page2(message);
}));
Routes.router = router;
}
}
router.define作用相当于注册页面,这个方法有两个参数:
参数 | 作用 |
---|---|
routePath | 相当于跳转的链接 |
handler | 用来获取传参和创建界面 |
在上面配置路由的代码中,有这么一段代码var message = params[‘message’]?.first;,这块是固定写法,取参数就这么取就对了。这个代码在练习里的作用就是,第一个界面传递一个参数名为message的参数给第二个界面。
这个界面用来传递一个值给第二个界面,当从第二个界面返回时显示回传值。page_one.dart中的代码如下:
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:ui_test_no4/routes.dart';
import 'dart:convert';
///第一个界面
class Page1 extends StatefulWidget {
@override
State createState() => Page1State();
}
class Page1State extends State {
String message = '一';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('第一个页面'),
actions: [
IconButton(
icon: Icon(Icons.chevron_right),
onPressed: () => intentTo(context)
)
],
),
body: Center(
child: Text(message)
),
);
}
///跳转到第二个界面
intentTo(BuildContext context) {
///字符串编码
var json = jsonEncode(Utf8Encoder().convert('来自第一个界面'));
Routes.router.navigateTo(
context, '${Routes.page2}?message=$json',//跳转路径
transition: TransitionType.inFromRight//过场效果
).then((result) {//回传值
if (result != null) {
message = result;
}
});
}
}
跳转这很容易理解,请看intentTo这个方法。为了看的清晰我把跳转的功能代码单独放到了这个方法中。参数转码的原因是这个库在拼接链接的时候不支持中文字符(除了数字字母挺多都不支持)。
第二个界面就一个文本加一个按钮,文本显示传递过来的值。点击按钮返回到上一个界面,并向第一个界面返回一条文字。page_two.dart代码如下:
import 'package:flutter/material.dart';
import 'dart:convert';
///第二个界面
class Page2 extends StatelessWidget {
final String message;
const Page2(this.message);
@override
Widget build(BuildContext context) {
var list = List();
///字符串解码
jsonDecode(message).forEach(list.add);
final String value = Utf8Decoder().convert(list);
return Scaffold(
appBar: AppBar(
title: Text('第二个页面'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(value),
RaisedButton(
onPressed: () => Navigator.pop(context, '来自第二个界面'),
child: Text('返回上一个界面')
)
],
)
)
);
}
}
在主函数初始化路由的配置。main.dart代码如下:
import 'package:flutter/material.dart';
import 'package:fluro/fluro.dart';
import 'package:ui_test_no4/routes.dart';
///启动
void main() {
///初始化并配置路由
final router = new Router();
Routes.configureRoutes(router);
runApp(
MaterialApp(
onGenerateRoute: Routes.router.generator
)
);
}