在现有小部件上进行Flutter自定义路由转换调用initstate

时间:2019-04-02 12:11:44

标签: flutter flutter-animation

我已经为Flutter构建了自定义PageRouteBuilder,因为我需要进行这样的转换:

  • 新屏幕在
  • 中滑动
  • 当前屏幕(旧屏幕)滑出

两个屏幕同时滑动。

我设法通过以下方式做到这一点:

class SlideLeftRoute extends PageRouteBuilder {
  final Widget widget;
  final Widget prevWidget;

  SlideLeftRoute({this.widget, this.prevWidget})
      : super(
      pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
        return widget;
      },
      transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
        List<Widget> stackWidgets = new List<Widget>();

        if (prevWidget != null) {
          stackWidgets.add(Positioned(
              child: SlideTransition(
                  position: new Tween<Offset>(
                    begin: const Offset(0.0, 0.0),
                    end: const Offset(1.0, 0.0),
                  ).animate(animation),
                  child: prevWidget)));
        }

        stackWidgets.add(Positioned(
            child: SlideTransition(
                position: new Tween<Offset>(
                  begin: const Offset(-1.0, 0.0),
                  end: const Offset(0.0, 0.0),
                ).animate(animation),
                child: child)));

        return Stack(
              children: stackWidgets,
            );
      }
  );
}

从视觉上看,它的工作原理是

从功能上讲,它具有一些意外的行为: 当我使用此构建器进行导航时,将调用上一个窗口小部件的initState

假设我在Screen1中,然后导航到Screen2,向Navigator提供此构建器。

根据指定的Screen1,我的Screen2滑出而SlideTransition滑入。

这样做的同时,initStateScreen1调用。

现在,我希望initState被称为Screen2,因为我正在构建它并将其推送到我的导航中。但是,为什么Screen1呢?

有什么办法可以避免吗?

谢谢!

0 个答案:

没有答案