Animation FadeTransition()小部件在Flatter中仅设置一次动画? 类pin扩展StatefulWidget{ @凌驾 _PinState createState()=>\u PinState(); } 类_PinState使用TickerProviderStateMixin扩展状态{ 动画控制器_控制器; 动画(动画),; 布尔误差=假; @凌驾 void initState(){ super.initState(); 此.\u控制器=动画控制器( 持续时间:常量持续时间(毫秒:1000),vsync:this; 这是动画= 吐温(开始:0.0,结束:1.0)。动画(曲线动画)( 父节点:_控制器, 曲线:Curves.easeIn, )); } @凌驾 小部件构建(构建上下文){ if(此错误){ 这个错误=false; _controller.forward(); } 返回容器( 子级:if(this.error) 容器( 孩子:FadeTransition( 不透明度:_动画, 子:列( mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 填充物( 填充:常数边集全部(8.0), 子项:Image.asset(“assets/images/sad_face.png”), ), ], ), ), ), ), } }
在上面的代码中,Animation FadeTransition()小部件在Flatter中仅设置一次动画? 类pin扩展StatefulWidget{ @凌驾 _PinState createState()=>\u PinState(); } 类_PinState使用TickerProviderStateMixin扩展状态{ 动画控制器_控制器; 动画(动画),; 布尔误差=假; @凌驾 void initState(){ super.initState(); 此.\u控制器=动画控制器( 持续时间:常量持续时间(毫秒:1000),vsync:this; 这是动画= 吐温(开始:0.0,结束:1.0)。动画(曲线动画)( 父节点:_控制器, 曲线:Curves.easeIn, )); } @凌驾 小部件构建(构建上下文){ if(此错误){ 这个错误=false; _controller.forward(); } 返回容器( 子级:if(this.error) 容器( 孩子:FadeTransition( 不透明度:_动画, 子:列( mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 填充物( 填充:常数边集全部(8.0), 子项:Image.asset(“assets/images/sad_face.png”), ), ], ), ), ), ), } },animation,flutter,Animation,Flutter,在上面的代码中,FadeTransition()小部件在应用程序首次启动时被设置动画。 FadeTransition()的可见性由error变量切换。 但是下次看到FadeTransition()小部件时,它是否未设置动画 当切换FadeTransition()时,小部件应该在每次出现时都设置动画 error变量是使用Providers从外部设置的,只要error发生更改,小部件就会重新生成,因此无需使用setState()我注意到的一件事是error总是错误的。没有代码将其转换为true,并且
FadeTransition()
小部件在应用程序首次启动时被设置动画。
FadeTransition()
的可见性由error
变量切换。
但是下次看到FadeTransition()
小部件时,它是否未设置动画
当切换<代码>FadeTransition()时,小部件应该在每次出现时都设置动画
error
变量是使用Providers
从外部设置的,只要error
发生更改,小部件就会重新生成,因此无需使用setState()
我注意到的一件事是error
总是错误的。没有代码将其转换为true,并且有两个地方会将其设置为false。其中一个取决于它是否为真(因为error=true
不存在,所以它永远不会为真)
也就是说,如果要使动画再次运行,无论何时切换此属性(通常在按钮的onTap
方法中),都必须调用setState。
在设置状态中,您可以使用
class pin extends StatefulWidget {
@override
_PinState createState() => _PinState();
}
class _PinState extends State<pin> with TickerProviderStateMixin {
AnimationController _controller;
Animation<double> _animation;
bool error = false;
@override
void initState() {
super.initState();
this._controller = AnimationController(
duration: const Duration(milliseconds: 1000), vsync: this);
this._animation =
Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
parent: _controller,
curve: Curves.easeIn,
));
}
@override
Widget build(BuildContext context) {
if(this.error) {
this.error = false;
_controller.forward();
}
return Container(
child: if (this.error)
Container(
child: FadeTransition(
opacity: _animation,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset("assets/images/sad_face.png"),
),
],
),
),
),
),
}
}
使用
controller.forward(from:0)时,问题得到解决
但是我想知道其他动画没有在控制器中使用中的也能正常工作,为什么?
controller.forward(from: 0);
// or
controller.reset(); // stops the animation if in progress
controller.forward();