如何发回数据并导航到特定屏幕? [扑]

时间:2019-10-23 07:05:06

标签: flutter

我有一个日历小部件,它以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发送回来的参数吗?

3 个答案:

答案 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),
);

这将删除已推送路线下方的所有路线。

Read more about pushAndRemoveUntil

答案 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