- 路由跳转
Navigator.of(context).push(//等待这段代码给返回值才继续往下走
MaterialPageRoute(builder: (context){
return MenuPage();
},
settings: RouteSettings(
name: 'menu',
arguments: ''
),//路由的一些设置,如果是首页就无返回按钮等等
maintainState: false,//在跳转的时候释放资源就设置为false,1-》2,也就是释放1
fullscreenDialog: false//true是不是全屏的,从下网上。false就是push
),);
-
路由的settings: RouteSettings()也可以在页面B拿到
在B界面通过dynamic arguments = ModalRoute.of(context)?.settings.arguments;
而且RouteSettings的值可以设置多个,类型也没有限制 -
路由回调传值,页面Apush到页面B,页面B的内容回调给页面A
在页面A通过async和await等待返回值,也可以通过Navigator的then方法获取
ElevatedButton(onPressed: () async {
var result = await Navigator.of(context).push(//等待这段代码给返回值才继续往下走
MaterialPageRoute(builder: (context){
return MenuPage();
},
settings: RouteSettings(
name: 'menu',
arguments: ''
),//路由的一些设置,如果是首页就无返回按钮等等
maintainState: false,//在跳转的时候释放资源就设置为false,1-》2,也就是释放1
fullscreenDialog: false//true是不是全屏的,从下网上。false就是push
),);
print(result);
},child: Text('登录'),)
页面A通过Navigator的then方法
Navigator.of(context).push(//等待这段代码给返回值才继续往下走
MaterialPageRoute(builder: (context){
return MenuPage(title: '菜单页面');
},
settings: RouteSettings(
name: 'menu',
arguments: ''
),//路由的一些设置,如果是首页就无返回按钮等等
maintainState: false,//在跳转的时候释放资源就设置为false,1-》2,也就是释放1
fullscreenDialog: false//true是不是全屏的,从下网上。false就是push
),).then((value) => print(value));
页面B
ElevatedButton(
onPressed: (){
Navigator.of(context).pop('返回值');
},
child:const Text('返回'),
)
-
路由命名
因为如上路由的写法比较繁琐,可以在main.dart里面定义别名路由,定义路由后要将home注释掉,会自动去寻找‘/’对应的界面,也可以通过 initialRoute: "menu",后面跟路由别名的形式定义首界面
MaterialApp(
debugShowCheckedModeBanner: false,
routes: {
"/" : (context) => LoginPage(),
'menu' : (context) => MenuPage()
},
// home: LoginPage(),
);
- 起了别名之后,可以通过pushNamed来跳转,arguments可以传递参数
Navigator.of(context).pushNamed("menu",arguments: "菜单");
- 别名返回:
Navigator.of(context).popAndPushNamed("menu",arguments: "菜单");
- 路由拦截
onGenerateRoute: (s){
print(s.name);//在这里面根据路由可以进行拦截,比如说未登录拦截等等
},