Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 推另一页时,滑出另一页的最佳方式是什么?_Flutter_Flutter Navigation - Fatal编程技术网

Flutter 推另一页时,滑出另一页的最佳方式是什么?

Flutter 推另一页时,滑出另一页的最佳方式是什么?,flutter,flutter-navigation,Flutter,Flutter Navigation,这个问题在这里已经讨论了一些,但是没有一个解决方案是干净的,或者做一些奇怪的事情,比如显示同一页两次。 我试图使它成为这样,当你导航到下一页时,当前页会向左滑动,而下一页会从右侧进入。然而,我能想到的最好的解决方案是将当前页面的内容包装成幻灯片翻译。当您导航到下一页时,您将在“SlideRightRoute”动画中打开新页,同时启动动画以将当前页滑出 虽然这是可行的,但感觉上我是在“反对框架”。我的问题是:是否有一种“正确”的方式来制作页面动画,或者这是当前框架中的一个漏洞(而像这样的解决方案

这个问题在这里已经讨论了一些,但是没有一个解决方案是干净的,或者做一些奇怪的事情,比如显示同一页两次。

我试图使它成为这样,当你导航到下一页时,当前页会向左滑动,而下一页会从右侧进入。然而,我能想到的最好的解决方案是将当前页面的内容包装成幻灯片翻译。当您导航到下一页时,您将在“SlideRightRoute”动画中打开新页,同时启动动画以将当前页滑出

虽然这是可行的,但感觉上我是在“反对框架”。我的问题是:是否有一种“正确”的方式来制作页面动画,或者这是当前框架中的一个漏洞(而像这样的解决方案是目前我们能做的最好的解决方案)

抽象类幻灯片页面
使用SingleTickerProviderStateMixin扩展状态{
动画控制器_控制器;
动画偏移;
@凌驾
void initState(){
super.initState();
_控制器=动画控制器(
vsync:这个,,
持续时间:持续时间(毫秒:500),
);
_偏移量=吐温(
开始:偏移量(0.0,0.0),
结束:偏移(-1.0,0.0),
).设置动画(_控制器);
}
@凌驾
小部件构建(构建上下文){
返回幻灯片转换(
位置:_偏移,
子:构建内容(上下文),
);
}
小部件buildContent(BuildContext);
未来推送(小部件页面)异步{
var result=Navigator.push(
上下文
新的SlideRightRoute(小部件:第页),
);
_controller.forward();
等待结果;
_controller.reverse();
}
}
类SlideRightRoute扩展PageRouteBuilder{
最终小部件;
SlideRightRoute({this.widget})
:超级(
转换持续时间:常量持续时间(毫秒:500),
pageBuilder:(构建上下文、动画、动画辅助动画){
返回控件;
},
transitionsBuilder:(构建上下文、动画、动画辅助动画、小部件子对象){
返回新的幻灯片转换(
职位:新吐温(
开始:常数偏移(1.0,0.0),
结束:偏移0.0,
).制作动画(动画),
孩子:孩子,
);
},
);
}
abstract class SlideablePage<T extends StatefulWidget> 
extends State<T> with SingleTickerProviderStateMixin {
  AnimationController _controller;
  Animation<Offset> _offset;

  @override
  void initState() {
    super.initState();

    _controller = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 500),
    );
    _offset = Tween<Offset>(
      begin: Offset(0.0, 0.0),
      end: Offset(-1.0, 0.0),
    ).animate(_controller);
  }

  @override
  Widget build(BuildContext context) {
    return SlideTransition(
      position: _offset,
      child: buildContent(context),
    );
  }

  Widget buildContent(BuildContext context);

  Future push(Widget page) async {
    var result = Navigator.push(
      context,
      new SlideRightRoute(widget: page),
    );
    _controller.forward();
    await result;
    _controller.reverse();
  }
}

class SlideRightRoute extends PageRouteBuilder {
  final Widget widget;
  SlideRightRoute({this.widget})
      : super(
          transitionDuration: const Duration(milliseconds: 500),
          pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
            return widget;
          },
          transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
            return new SlideTransition(
              position: new Tween<Offset>(
                begin: const Offset(1.0, 0.0),
                end: Offset.zero,
              ).animate(animation),
              child: child,
            );
          },
        );
}