【问题标题】:Flutter Route animation animate both new and old route to slideFlutter Route 动画为滑动的新旧路线设置动画
【发布时间】:2020-06-30 18:46:20
【问题描述】:

我可以制作一条新路线的动画,让它通过从右向左滑动来显示,并位于我当前页面的顶部。

但是,我想为两个页面(新页面和旧页面)制作动画。目标是它们都从右向左滑动,而不仅仅是新的滑到顶部。

这是我的代码,仅用于滑动右侧的代码:

class SlideRightRoute extends PageRouteBuilder {
  final Widget page;
  SlideRightRoute({this.page})
      : super(
            pageBuilder: (
              BuildContext context,
              Animation<double> animation,
              Animation<double> secondaryAnimation,
            ) =>
                page,
            transitionsBuilder: (
              BuildContext context,
              Animation<double> animation,
              Animation<double> secondaryAnimation,
              Widget child,
            ) {
              var begin = Offset(1.0, 0.0);
              var end = Offset.zero;
              var curve = Curves.ease;
              var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));

              return SlideTransition(
                position: animation.drive(tween),
                child: child,
              );
            });
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可能希望在带有SingleTickerProviderStateMixin 的有状态小部件中使用带有TabBarViewTabController

    import 'package:flutter/material.dart';
    
    TabController tabController;
    
    class MainScreen extends StatefulWidget {
      @override
      _MainScreenState createState() => _MainScreenState();
    }
    
    class _MainScreenState extends State<MainScreen> with SingleTickerProviderStateMixin {
      int activeTab = 0;
      @override
      void initState() {
        tabController = TabController(length: 3, vsync: this, initialIndex: 0)
          ..addListener(() {
            setState(() {
              activeTab = tabController.index;
            });
          });
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('WebAppTest'),
          ),
          body: Expanded(
            child: TabBarView(
              controller: tabController,
              children: <Widget>[
                FirstScreen(), //Index 0
                SecondScreen(), //Index 1
                ThirdScreen(), //Index 2
              ],
            ),
          ),
        );
      }
    }
    
    class FirstScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return RaisedButton(
          onPressed: () {
            tabController.animateTo(2);
          },
          child: Text('To Screen 3!'),
        );
      }
    }
    
    class SecondScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return RaisedButton(
          onPressed: () {
            tabController.animateTo(0);
          },
          child: Text('To Screen 1!'),
        );
      }
    }
    
    class ThirdScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return RaisedButton(
          onPressed: () {
            tabController.animateTo(1);
          },
          child: Text('To Screen 2!'),
        );
      }
    }
    

    【讨论】:

    • 效果很好。我不知道你可以在没有标签栏的情况下使用TabBarView。你能解释一下你为什么使用SingleTickerProviderStateMixin 吗?
    • TabController 需要 vsync 下的 TickerProvider - 这是用于选项卡之间的动画。 SingleTickerProviderStateMixin 混合在所需的类中以访问 TickerProvider
    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 2020-06-20
    • 2018-01-11
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2018-09-14
    相关资源
    最近更新 更多