Flutter:移动到上一个屏幕(2nd)并仅删除上一个屏幕(2nd 3rd 4th),而不是所有屏幕(1st 2nd 3rd 4th)

Posted

技术标签:

【中文标题】Flutter:移动到上一个屏幕(2nd)并仅删除上一个屏幕(2nd 3rd 4th),而不是所有屏幕(1st 2nd 3rd 4th)【英文标题】:Flutter: Move to previous screen(2nd) and remove only previous screen (2nd 3rd 4th), not all screen (1st 2nd 3rd 4th) 【发布时间】:2020-09-29 17:53:52 【问题描述】:

我有一个使用这样的导航打开应用程序的流程:

个人资料页面(第 1 次)-> 列出附件(第 2 次)-> 列出简历(第 3 次)-> 编辑简历(第 4 次)

然后,从“编辑简历(第 4 次)”中,我想通过“从第 2 次第 3 次第 4 次删除导航状态”转到“列出附件(第 2 次)”。因此,当我成功导航并打开“List Attachments(2nd)”屏幕时,以及当我从AppBar(在“List Attachments(2nd)”屏幕中)或设备(在“List Attachments”中单击返回按钮时(2nd)”屏幕),它不会返回“Edit Resume(4th)”,而是返回“Profile Page(1st)”。该怎么做?

我已经尝试过this:

    Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (context) => AttachmentsListPage(widget.userEntity)),
          (Route<dynamic> route) => false,
    );

它删除了“列表附件(2nd)”中AppBar 上的后退按钮。

我也试试这个:

Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (BuildContext context) => AttachmentsListPage(widget.userEntity)));

但还是不行。

仅供参考,我没有使用route

【问题讨论】:

【参考方案1】:

如果你想使用它,那么你必须在你想停止的地方返回 true,而不是总是返回 false。

Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (context) => AttachmentsListPage(widget.userEntity)),
          (Route<dynamic> route) => route is ProfilePage,
    );

你可以做的另一件事是,打电话

Navigator.pop(context); //will return to the previous screen
Navigator.pop(context); //will return to two screens before

您可以多次使用它。

【讨论】:

isThisRouteYouWantToStopAttachmentsListPage(widget.userEntity) ? 记住,它会弹出所有的路由,直到它变为真,然后它会将 AttachmentsListPage 的路由放在它上面。 或者你也可以使用 PopUntil,它只会删除所有的路线,直到它到达你将给它的路线 我尝试使用 1 号,仍然不行。如果是true,则返回按钮并且状态不会被移除,如果是false,则返回按钮和状态被移除。但是我尝试了2号,它正在工作。那么,这是最好的做法吗?或者有什么选择? 不,pushAndRemoveUntiland popUntill 更好【参考方案2】:

尝试使用它移动到第二页(设置路线名称)。

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (_) => SecondPage(),
    settings: RouteSettings(name: '/second'),
  ),
);

然后在第四页使用这个尝试返回第二页而不丢失第二页状态如果没有找到然后返回主页面(初始路由)。

Navigator.popUntil(
  context,
  (Route route) 
    String name = route.settings.name;
    bool secondPage = name == '/second';
    bool initPage = name == '/';
    return !initPage ? secondPage : initPage;
  ,
);

this 是结果。

【讨论】:

【参考方案3】:

我使用popUntil 解决了这个问题。

Navigator.popUntil(context, ModalRoute.withName(routeName))

【讨论】:

以上是关于Flutter:移动到上一个屏幕(2nd)并仅删除上一个屏幕(2nd 3rd 4th),而不是所有屏幕(1st 2nd 3rd 4th)的主要内容,如果未能解决你的问题,请参考以下文章

使用手势后删除视图和移动内容

选择特定范围的单元格并仅删除突出显示的单元格并向上移动的 VBA

选择 2 标记移动到上一行

Flutter 再次触发 bloc 事件

如何将值从一个活动传递到上一个活动

11-Flutter移动电商实战-首页_屏幕适配方案和制作