一吮龄、路由傳值
直接通過(guò)路由的構(gòu)造方法傳遞值俭茧。
我們創(chuàng)建一個(gè)TipRoute路由,它接受一個(gè)提示文本參數(shù)漓帚,負(fù)責(zé)將傳入它的文本顯示在頁(yè)面上母债,另外TipRoute中我們添加一個(gè)“返回”按鈕,點(diǎn)擊后在返回上一個(gè)路由的同時(shí)會(huì)帶上一個(gè)返回參數(shù)尝抖,下面我們看一下實(shí)現(xiàn)代碼毡们。
class TipRoute extends StatelessWidget {
TipRoute({
Key key,
@required this.text, // 接收一個(gè)text參數(shù)
}) : super(key: key);
final String text;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("提示"),
),
body: Padding(
padding: EdgeInsets.all(18),
child: Center(
child: Column(
children: <Widget>[
Text(text),
ElevatedButton(
onPressed: () => Navigator.pop(context, "我是返回值"),
child: Text("返回"),
)
],
),
),
),
);
}
}
下面是打開(kāi)新路由TipRoute的代碼:
class RouterTestRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: () async {
// 打開(kāi)`TipRoute`,并等待返回結(jié)果
var result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return TipRoute(
// 路由參數(shù)
text: "我是提示xxxx",
);
},
),
);
//輸出`TipRoute`路由返回結(jié)果
print("路由返回值: $result");
},
child: Text("打開(kāi)提示頁(yè)"),
),
);
}
}
二昧辽、命名路由傳參
我們先注冊(cè)一個(gè)路由:
routes:{
"new_page":(context) => EchoRoute(),
} ,
在路由頁(yè)面通過(guò)RouteSetting對(duì)象獲取路由參數(shù):
class EchoRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
//獲取路由參數(shù)
var args=ModalRoute.of(context).settings.arguments;
//...省略無(wú)關(guān)代碼
}
}
在我們項(xiàng)目中通過(guò)如上方式無(wú)法獲取到傳參衙熔。后面我發(fā)現(xiàn),項(xiàng)目中使用onGenerateRoute 代替了routes做路由跳轉(zhuǎn)搅荞。
需要注意的是:onGenerateRoute 只有沒(méi)在routes中注冊(cè)的路由才會(huì)被回調(diào)红氯。
通過(guò)onGenerateRoute 這種方式攔截,參數(shù)傳遞到onGenerateRoute 中的setting了咕痛,所以痢甘,我們無(wú)法在widget中通過(guò)ModalRoute.of(context).settings.arguments獲取參數(shù)。
我們可以在onGenerateRoute 中通過(guò)方式一:路由傳值 來(lái)實(shí)現(xiàn)茉贡。