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