Flutter 颤振动画在执行6次后停止执行

Flutter 颤振动画在执行6次后停止执行,flutter,dart,Flutter,Dart,我正在创建一个反复发生的“轻松进入”和“轻松退出”动画,容器小部件先轻松进入-暂停-然后再轻松退出。我已经创建了动画,它做得很好,但在6次执行后,它停止了!我尝试将第二个侦听器放在它自己的方法中,然后使用RemovelListener,但它也没有用。 如有任何建议或想法,将不胜感激。 这是我的密码: import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends St

我正在创建一个反复发生的“轻松进入”和“轻松退出”动画,容器小部件先轻松进入-暂停-然后再轻松退出。我已经创建了动画,它做得很好,但在6次执行后,它停止了!我尝试将第二个侦听器放在它自己的方法中,然后使用RemovelListener,但它也没有用。 如有任何建议或想法,将不胜感激。 这是我的密码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primaryColor: Colors.red),
      home: EaseAnimation(),
    );
  }
}

class EaseAnimation extends StatefulWidget {
  @override
  _EaseAnimationState createState() => _EaseAnimationState();
}

class _EaseAnimationState extends State<EaseAnimation>
    with TickerProviderStateMixin {
  Animation _animation;
  AnimationController _controller;
  @override
  void initState() {
    void listener(status) {
      if (status == AnimationStatus.completed) {
        _animation.removeStatusListener(listener);
        _controller.reset();
        _animation = Tween(begin: 0.0, end: 1.0).animate(
            CurvedAnimation(parent: _controller, curve: Curves.fastOutSlowIn))
          ..addStatusListener((status) {
            if (status == AnimationStatus.completed) {
              _controller.reset();
              _animation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation(
                  parent: _controller, curve: Curves.fastOutSlowIn))
                ..addStatusListener(listener);
              _controller.forward();
            }
          });
      }
    }

    _controller =
        AnimationController(vsync: this, duration: Duration(seconds: 2));
    _animation = Tween(begin: -1.0, end: 0.0).animate(
        CurvedAnimation(parent: _controller, curve: Curves.fastOutSlowIn))
      ..addStatusListener(listener);
    _controller.forward();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final double width = MediaQuery.of(context).size.width;
    return AnimatedBuilder(
      animation: _controller,
      builder: (BuildContext context, Widget child) {
        return Scaffold(
          body: Transform(
            transform:
                Matrix4.translationValues(_animation.value * width, 0.0, 0.0),
            child: Center(
                child: Container(
              height: 200,
              width: 200,
              color: Colors.black,
            )),
          ),
        );
      },
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:主题数据(原色:Colors.red),
主页:EaseAnimation(),
);
}
}
类EaseAnimation扩展了StatefulWidget{
@凌驾
_EaseAnimationState createState()=>u EaseAnimationState();
}
类_EaseAnimationState扩展状态
使用TickerProviderStateMixin{
动画(动画),;
动画控制器_控制器;
@凌驾
void initState(){
无效侦听器(状态){
如果(状态==AnimationStatus.completed){
_动画。removeStatusListener(listener);
_controller.reset();
_动画=Tween(开始:0.0,结束:1.0)。设置动画(
曲线动画(父对象:\控制器,曲线:Curves.fastoutswowin))
..addStatusListener((状态){
如果(状态==AnimationStatus.completed){
_controller.reset();
_动画=Tween(开始:-1.0,结束:0.0)。动画(曲线动画)(
父项:_控制器,曲线:Curves.fastoutswowin)
..addStatusListener(侦听器);
_controller.forward();
}
});
}
}
_控制器=
AnimationController(vsync:this,duration:duration(秒数:2));
_动画=Tween(开始:-1.0,结束:0.0)。设置动画(
曲线动画(父对象:\控制器,曲线:Curves.fastoutswowin))
..addStatusListener(侦听器);
_controller.forward();
super.initState();
}
@凌驾
小部件构建(构建上下文){
final double width=MediaQuery.of(context).size.width;
返回动画生成器(
动画:_控制器,
生成器:(BuildContext上下文,小部件子项){
返回脚手架(
正文:变换(
转换:
矩阵4.平移值(_animation.value*width,0.0,0.0),
儿童:中心(
子:容器(
身高:200,
宽度:200,
颜色:颜色,黑色,
)),
),
);
},
);
}
}

快速但具有破坏性的解决方案是将
侦听器中的
if
条件更改为:

if(状态==AnimationStatus.completed | |状态==AnimationStatus.discomered){
然而,动画的设计方式会带来很多问题。事实上,它已经造成了麻烦

动画被卡住的原因是,它将一个动画侦听器嵌套到另一个动画侦听器中,进入一种被锁定的无限循环,颤振试图处理该循环


我建议使用类设计自定义动画曲线

Cubic(0,1,1,0)

此简单曲线将在其进程中间停顿动画。

现在,我们可以将您的代码修改为更简单的方式—如下所示:

void侦听器(状态){
如果(状态==AnimationStatus.completed){
_控制器转发(从:0开始);
}
}
@凌驾
void initState(){
super.initState();
_controller=AnimationController(vsync:this,duration:duration(秒数:4));
_动画=Tween(开始:-1.0,结束:1.0)。设置动画(
曲线动画(父对象:_控制器,曲线:常量立方(0,1,1,0))
)
..addStatusListener(侦听器);
_controller.forward();
}
这将呈现一个从左侧开始、进入屏幕中心、暂停、然后恢复到屏幕末尾并重复的黑框

如果我建议的曲线不适合您的情况-将帮助您设计自己的自定义曲线,以及帮助您了解一般的三次贝塞尔曲线


让我知道这是否有帮助。

将动画侦听器彼此嵌套在一起对我来说似乎是一个糟糕的主意。您是否试图将动画从
-1.0
驱动到
1.0
,然后从
1.0
反转到
-1.0
,然后重复?我正在尝试从-1设置动画,然后从0设置到1,然后重复。(-1=>0,0=>1)