颤振-防止循环弹出

时间:2019-12-10 22:02:53

标签: flutter dart

在Flutter应用程序中,我有两个页面(ViewPageEditPage),两个页面都有直接相互路由的按钮。也可以直接从EditPage进入HomePage页面。

场景路线: HomePage > ViewPage > EditPage > ViewPage > EditPage > ViewPage > ...

使用此示例路由,它要求用户弹出几次才能返回HomePage。即使用户在EditPageHomePage > ViewPage之间来回几次,是否有办法使从EditPageViewPage的路线?

当前代码:

    Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => EditPage(
              contract: contract,
            ),
          ),
        );

我尝试使用各种不同的导航选项都没有成功(例如下面的pushAndRemoveUntil)。

    var route = MaterialPageRoute(
        builder: (context) => EditPage(
          contract: contract,
        ),
      );

    Navigator.of(context).pushAndRemoveUntil(route, (route) => !route.isActive);

澄清性修改:

用户的示例路线:HomePage > ViewPage > EditPage > ViewPage > EditPage > ViewPage > EditPage

在最后一个EditPage上弹出时的当前路由行为:HomePage > ViewPage > EditPage > ViewPage > EditPage > ViewPage

在最后一个EditPage上弹出时所需的路由行为:HomePage > ViewPage

说明编辑2: 想得更多,这是使这项工作有效的逻辑(我认为)。从ViewPage弹出时,请始终导航至HomePage(我想我可以使用标准的.push方法来使它起作用)。

但是,当从EditPage弹出时,它需要转到ViewPage(如果最初是从ViewPage导航到)或转到HomePage(如果是从{{ 1}}。总之,如果HomePage在路线中,请转到ViewPage的第一个实例,否则请导航到ViewPage的第一个实例。

我希望这一切都有意义,因为这样做有点令人困惑...

2 个答案:

答案 0 :(得分:1)

@Ned,想知道您是否尝试过如下所示的pushNamedAndRemoveUntil

  • 主要:
auto call = [](auto&&...funcs) {
    (funcs(),...);
};

int main()
{
    A<int, float, char> l;
    std::get<0>(l.funcs) = []() { cout << "Calling int()" << endl; return 1; };
    std::get<1>(l.funcs) = []() { cout << "Calling float()" << endl; return 1.f; };
    std::get<2>(l.funcs) = []() { cout << "Calling char()" << endl; return '1'; };

    std::apply(call, l.funcs);
    return 0;
}
  • 然后您可以按以下方式从EditPage推送(反之亦然)
    void main(){
      runApp(new MaterialApp(
        home: new HomePage(),
        routes: <String, WidgetBuilder> {
          'HomeScreen': (BuildContext context) => new HomePage(),
          'EditScreen': (BuildContext context) => new EditPage(),
        },
      ));
    }

答案 1 :(得分:1)

通过使用if语句和一个额外的变量来解决。如果我们从ViewPage导航到Edit,请使用.pop()回到ViewPage,否则(从主页)“。push” EditPage。

ViewPage:

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => EditPage(
      pushedFromViewPage: true,
    ),
  ),
);

EditPage:

if (widget.pushedFromViewPage) {
  Navigator.of(context).pop();
} else {
  Route route = MaterialPageRoute(
    builder: (context) => ViewPage(),
  );
  Navigator.of(context).push(route);
}