Flutter 提供了基本路由和命名路由两种方式,来管理页面间的跳转。其中,基本路由需要自己手动创建页面实例,通过 Navigator.push 完成页面跳转;而命名路由需要提前注册页面标识符和页面创建方法,通过 Navigator.pushNamed 传入标识符实现页面跳转。 对于命名路由,如果我们需要响应错误路由标识符,还需要一并注册 UnknownRoute。为了精细化控制路由切换,Flutter 提供了页面打开与页面关闭的参数机制,我们可以在页面创建和目标页面关闭时,取出相应的参数。 可以看到,关于路由导航,Flutter 综合了 Android、iOS 和 React 的特点,简洁而不失强大。
而在中大型应用中,我们通常会使用命名路由来管理页面间的切换。命名路由的最重要作用,就是建立了字符串标识符与各个页面之间的映射关系,使得各个页面之间完全解耦,应用内页面的切换只需要通过一个字符串标识符就可以搞定,为后期模块化打好基础。
入栈\出栈 (通过Navigator来管理)
入栈
Future push(BuildContext context, Route route)
Future pushNamed(BuildContext context, String routeName,{Object arguments}) // 通过路由名打开新路由页
出栈
bool pop(BuildContext context, [ result ])
//导航到新路由 等价于Navigator.of(context).push(Route route)
Navigator.push( context,
MaterialPageRoute(builder: (context) {
return NewRoute();
}));
},
// 通过路由名打开新路由页
Navigator.pushNamed(context, "new_page");
// 在打开路由时传递参数
Navigator.of(context).pushNamed("new_page", arguments: "hi");
// 接收回来的值 (就是就是Future类型两种写法)
/ / 打开`TipRoute`,并等待返回结果
var result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TipRoute(
// 路由参数
text: "我是提示xxxx",
);
},
),
);
//输出`TipRoute`路由返回结果
print("路由返回值: $result");
// 第二种写法
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TipRoute(
// 路由参数
text: "我是提示xxxx",
);
},
),
).then((result){
print("路由返回值: $result");
});
问题
- 路由传递值必须是pushName方式吗?
- 路由传值类型可以自定义(比如对象)吗?
以下内容先忽略
#注册路由表
MaterialApp(
title: 'Flutter Demo',
initialRoute:"/", //名为"/"的路由作为应用的home(首页)
theme: ThemeData(
primarySwatch: Colors.blue,
),
//注册路由表
routes:{
"new_page":(context)=>NewRoute(),
"/":(context)=> MyHomePage(title: 'Flutter Demo Home Page'), //注册首页路由
}
);