主页面就是一个创建工程时自带的页面,在里边做了点修改,添加了onGenerateRoute属性
import 'chapter2/RouterTestRoute.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
routes: {
"RouterTestRoute":(context)=>RouterTestRoute(),
"/":(context) => MyHomePage(title: 'Flutter Demo Home Page')
},
onGenerateRoute: (RouteSettings settings){
var routeName =settings.name;
var arguments = settings.arguments;
print("要跳转的路由是:$routeName");
print("传入到路由的中的参数是:$arguments");
//这里是经过判断的,然后打开的路由
if(routeName!=null&&routeName=="TipRoute"){
return MaterialPageRoute(builder: (context){
return TipToute(text: "我经过判断就进来的");
});
}
return MaterialPageRoute(builder: (context){
return TipToute(text: "我没有经过判断就进来的");
});
},
//home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
第二页面
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class RouterTestRoute extends StatelessWidget{
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(title: Text("测试传值"),),
body: Center(
child: RaisedButton(
child: Text("打开新页面"),
onPressed: () async{
//打开新的路由,并返回具体的值
var result=await Navigator.pushNamed(context, "TipRoute",arguments: "我是从RouterTestRoute过来的");
//打印从TipRoute带回来的值
print("我是从Tip Route传回来的值:${result}");
},
),
),
);
}
}
第三个页面
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class TipToute extends StatelessWidget{
TipToute({
Key key,
@required this.text
}):super(key: key);
final String text;
@override
Widget build(BuildContext context) {
//this.text=ModalRoute.of(context).settings.arguments;
// TODO: implement build
return Scaffold(
appBar: AppBar(title: Text("提示"),),
body: Center(
child: Column(
children: [
Text(this.text),
RaisedButton(onPressed: (){
Navigator.pop(context,"我是返回值");
},
child: Text("返回"),
)
],
),
),
);
}
}
在fullter路由管理中,路由就是页面,路由管理就是管理页面怎么进栈和出栈。路由进栈有俩种方法,一种是直接push,一种是pushName,如果使用pushName的话需要需要使用路由列表,路由之间传参书中写的详细,这里就不再多说。只是在我们使用权限判断是否要打开那个路由的话需要使用到onGenerateRoute,这个只能使用命名路由的方法进栈,当pushName在routes路由列表找不到对应的路由时就会去onGenerateRoute中找,我们可以把需要权限判断跳转的路由放到这里打开。