我有一个日历小部件,它以DateTime
的形式选择一个日期。我想使用Navigator.pop
发送该值,但我也想使用MaterialPageRoute
将用户发送回页面。我不能这样使用Navigator.pop
:
onPressed: () async{
DateTime send = date;
Navigator.pop(context, MaterialPageRoute(
builder: (context) => DayPageViewExample(date),
)
);
},
因为用户将在以下流程中导航到日历屏幕:初始屏幕=>第二屏幕=>日历屏幕。并且必须将日历中的选定日期发送回初始屏幕。
我本质上想要这样的东西:
onPressed: () async{
DateTime send = date;
Navigator.pop(context, send);
},
但是我想将DateTime send
作为参数发送到MaterialPageRoute
。
我可以得到一些有关如何重构Navigator.pop
的建议,以便我可以使用MaterialPageRoute
发送回来的参数吗?
答案 0 :(得分:0)
要返回第一条路线,您可以使用popUntil
-像这样:
Navigator.of(context).popUntil((route) => route.isFirst);
但是,如果您要发送结果-我认为您可以使用pushReplacement
Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (context) => DayPageViewExample(date),
)
);
它只会关闭现有路线以打开新路线
希望这就是您需要的
答案 1 :(得分:0)
您想要执行以下操作的声音:
Navigator.pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) => DayPageViewExample(date)),
(Route<dynamic> route) => false),
);
这将删除已推送路线下方的所有路线。
答案 2 :(得分:0)
我遇到了类似的问题:TabScreen-> TakePhotoScreen-> DisplayPhotoScreen,并且在显示照片之后,我想返回到TabScreen,并选择了一个特定的标签。
在DisplayScreen中,我用WillPopScope
包裹了主窗口小部件:
body: Center(
child: WillPopScope(
onWillPop: _handleNavigatorPop,
child: ...
)
)
_handleNavigatorPop
方法显示一个警报对话框。关于“是”操作:
actions: <Widget>[
FlatButton(
child: Text("Yes"),
onPressed: () async {
final PageRouteBuilder _route = PageRouteBuilder(
pageBuilder: (BuildContext context, _, __) {
return TabsScreen(tabIndex: tabIndex);
});
//to remove all the routes below the pushed route, use a RoutePredicate that always returns false (e.g. (Route<dynamic> route) => false).
await Navigator.pushAndRemoveUntil(context, _route, (Route<dynamic> r) => false);
return Future.value(false);
},
),
FlatButton(
child: Text("No"),
onPressed: () {
Navigator.of(context).pop();
},
),
]
了解更多:pushAndRemoveUntil