如何使用Flutter Navigator推送多个路由

19

如果我在Flutter中将一个路由推入到我的应用程序的深处,是否有办法提供其他的路由,以便可以自定义后退/上一步导航?

2个回答

19
您可以多次调用Navigator.push()方法,在顶端路由下面的路由将不会有可见的过渡效果,但它们会被隐藏在下方。(注:最近发现这个说法在iOS上似乎不正确,请参考issue 12146)

请注意,您还可以使用NavigatorState的方法来修改顶层路由下面的路由,比如removeRouteBelowreplaceRouteBelow。这对于构建非线性导航体验非常有用。


谢谢!Flutter如何知道等待最后一次调用Navigator.push()的时间,多个调用是否应该链接在一起? - Arthur Thompson
1
结果是,它并没有。我提交了 https://github.com/flutter/flutter/issues/12146 (如果你感到有冒险精神,可以自行修复)。 - Collin Jackson

10

我通过推送多个没有动画的路由来解决过渡可见性问题。到目前为止,在iOS上它对我很有效。以下是一种实现方法。

通过扩展MaterialPageRoute并覆盖buildTransitions创建一个NoAnimationPageRoute

class NoAnimationPageRoute<T> extends MaterialPageRoute<T> {
  NoAnimationPageRoute({ WidgetBuilder builder }) : super(builder: builder);

  @override
  Widget buildTransitions(
      BuildContext context,
      Animation<double> animation,
      Animation<double> secondaryAnimation,
      Widget child) {
    return child;
  }
}

创建一个使用NoAnimationPageRoute的函数:
Future<T> pushWithoutAnimation<T extends Object>(Widget page) {
  Route route = NoAnimationPageRoute(builder: (BuildContext context) => page);
  return Navigator.push(context, route);
}

连续调用该函数几次:

pushWithoutAnimation(Screen1());
pushWithoutAnimation(Screen2());
pushWithoutAnimation(Screen3());

@YuyaMatsuo 哎呀!刚刚用“无动画页面路由”更新了答案。我当时一定是匆忙发布的 :/ - Touré Holder
在iOS上,后退滑动手势似乎无法在子类NoAnimationPageRoutes上工作。 - ftvs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接