Flutter 每次我进入文本字段时,颤振动画切换器都会重建
在下面的代码中,我希望AnimatedSwitcher下的文本仅在按下FlatButton时才设置动画,但它会为我在TextField中输入的每个角色设置动画。由于TextField的onChanged方法中有一个setState,因此每次输入角色时都会触发动画 如何防止AnimatedSwitcher在每次调用setState方法时重建,并且仅在其子对象的值已更新时重建Flutter 每次我进入文本字段时,颤振动画切换器都会重建,flutter,animation,dart,flutter-layout,flutter-animation,Flutter,Animation,Dart,Flutter Layout,Flutter Animation,在下面的代码中,我希望AnimatedSwitcher下的文本仅在按下FlatButton时才设置动画,但它会为我在TextField中输入的每个角色设置动画。由于TextField的onChanged方法中有一个setState,因此每次输入角色时都会触发动画 如何防止AnimatedSwitcher在每次调用setState方法时重建,并且仅在其子对象的值已更新时重建 class _TestScreenState extends State<TestScreen> { int
class _TestScreenState extends State<TestScreen> {
int _counter = 0;
int _value = 0;
TextEditingController controller = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
AnimatedSwitcher(
duration: Duration(milliseconds: 300),
child: Text(_counter.toString(),
key: UniqueKey(), style: TextStyle(fontSize: 50)),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
opacity: animation,
child: ScaleTransition(
scale: animation.status == AnimationStatus.dismissed
? Tween<double>(begin: .5, end: 1).animate(animation)
: AlwaysStoppedAnimation(1.0),
child: child,
),
);
},
),
Padding(
padding: EdgeInsets.all(10),
child: Text(
_value.toString(),
style: TextStyle(fontSize: 20),
),
),
Padding(
padding: EdgeInsets.all(10),
child: TextField(
controller: controller,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
onChanged: (val) {
setState(() {
_value = int.parse(val) * 5;
});
},
decoration: InputDecoration(labelText: "Enter amount"),
),
),
Padding(
padding: EdgeInsets.all(10),
child: FlatButton(
onPressed: () => setState(() {
_counter = int.parse(controller.text) * 5;
}),
child: Text('Tap to change value'),
),
)
],
),
);
}
}
class\u测试屏幕状态扩展状态{
int _计数器=0;
int _值=0;
TextEditingController=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
动画切换器(
持续时间:持续时间(毫秒:300),
子项:Text(_counter.toString(),
键:UniqueKey(),样式:TextStyle(fontSize:50)),
transitionBuilder:(小部件子项,动画){
返回衰减转换(
不透明度:动画,
子:ScaleTransition(
缩放:animation.status==AnimationStatus.scale
?吐温(开始:5,结束:1)。设置动画(动画)
:始终停止移动(1.0),
孩子:孩子,
),
);
},
),
填充物(
填充:边缘设置。全部(10),
子:文本(
_value.toString(),
样式:TextStyle(字体大小:20),
),
),
填充物(
填充:边缘设置。全部(10),
孩子:TextField(
控制器:控制器,
键盘类型:TextInputType.number,
textAlign:textAlign.center,
一旦更改:(val){
设置状态(){
_值=int.parse(val)*5;
});
},
装饰:输入装饰(标签文本:“输入金额”),
),
),
填充物(
填充:边缘设置。全部(10),
孩子:扁平按钮(
按下时:()=>设置状态(){
_计数器=int.parse(controller.text)*5;
}),
子项:文本(“点击以更改值”),
),
)
],
),
);
}
}
试试这个
class _TestScreenState extends State<TestScreen> {
int _counter = 0;
int _value = 0;
TextEditingController controller = TextEditingController();
@override
void initState() {
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
AnimatedSwitcher(
duration: Duration(milliseconds: 300),
child: Text(_counter.toString(), key: ValueKey<int>(_counter), style: TextStyle(fontSize: 50)),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
opacity: animation,
child: ScaleTransition(
scale: animation.status == AnimationStatus.dismissed
? Tween<double>(begin: .5, end: 1).animate(animation)
: AlwaysStoppedAnimation(1.0),
child: child,
),
);
},
),
Padding(
padding: EdgeInsets.all(10),
child: Text(
_value.toString(),
style: TextStyle(fontSize: 20),
),
),
Padding(
padding: EdgeInsets.all(10),
child: TextField(
controller: controller,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
onChanged: (val) {
setState(() {
_value = int.parse(val) * 5;
});
},
decoration: InputDecoration(labelText: "Enter amount"),
),
),
Padding(
padding: EdgeInsets.all(10),
child: FlatButton(
onPressed: () => setState(() {
_counter = int.parse(controller.text) * 5;
}),
child: Text('Tap to change value'),
),
)
],
),
);
}
}
class\u测试屏幕状态扩展状态{
int _计数器=0;
int _值=0;
TextEditingController=TextEditingController();
@凌驾
void initState(){
super.initState();
}
@凌驾
无效处置(){
controller.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
动画切换器(
持续时间:持续时间(毫秒:300),
子项:Text(_counter.toString(),key:ValueKey(_counter),style:TextStyle(fontSize:50)),
transitionBuilder:(小部件子项,动画){
返回衰减转换(
不透明度:动画,
子:ScaleTransition(
缩放:animation.status==AnimationStatus.scale
?吐温(开始:5,结束:1)。设置动画(动画)
:始终停止移动(1.0),
孩子:孩子,
),
);
},
),
填充物(
填充:边缘设置。全部(10),
子:文本(
_value.toString(),
样式:TextStyle(字体大小:20),
),
),
填充物(
填充:边缘设置。全部(10),
孩子:TextField(
控制器:控制器,
键盘类型:TextInputType.number,
textAlign:textAlign.center,
一旦更改:(val){
设置状态(){
_值=int.parse(val)*5;
});
},
装饰:输入装饰(标签文本:“输入金额”),
),
),
填充物(
填充:边缘设置。全部(10),
孩子:扁平按钮(
按下时:()=>设置状态(){
_计数器=int.parse(controller.text)*5;
}),
子项:文本(“点击以更改值”),
),
)
],
),
);
}
}
试试这个
class _TestScreenState extends State<TestScreen> {
int _counter = 0;
int _value = 0;
TextEditingController controller = TextEditingController();
@override
void initState() {
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
AnimatedSwitcher(
duration: Duration(milliseconds: 300),
child: Text(_counter.toString(), key: ValueKey<int>(_counter), style: TextStyle(fontSize: 50)),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(
opacity: animation,
child: ScaleTransition(
scale: animation.status == AnimationStatus.dismissed
? Tween<double>(begin: .5, end: 1).animate(animation)
: AlwaysStoppedAnimation(1.0),
child: child,
),
);
},
),
Padding(
padding: EdgeInsets.all(10),
child: Text(
_value.toString(),
style: TextStyle(fontSize: 20),
),
),
Padding(
padding: EdgeInsets.all(10),
child: TextField(
controller: controller,
keyboardType: TextInputType.number,
textAlign: TextAlign.center,
onChanged: (val) {
setState(() {
_value = int.parse(val) * 5;
});
},
decoration: InputDecoration(labelText: "Enter amount"),
),
),
Padding(
padding: EdgeInsets.all(10),
child: FlatButton(
onPressed: () => setState(() {
_counter = int.parse(controller.text) * 5;
}),
child: Text('Tap to change value'),
),
)
],
),
);
}
}
class\u测试屏幕状态扩展状态{
int _计数器=0;
int _值=0;
TextEditingController=TextEditingController();
@凌驾
void initState(){
super.initState();
}
@凌驾
无效处置(){
controller.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
动画切换器(
持续时间:持续时间(毫秒:300),
子项:Text(_counter.toString(),key:ValueKey(_counter),style:TextStyle(fontSize:50)),
transitionBuilder:(小部件子项,动画){
返回衰减转换(
不透明度:动画,
子:ScaleTransition(
缩放:animation.status==AnimationStatus.scale
?吐温(开始:5,结束:1)。设置动画(动画)
:始终停止移动(1.0),
孩子:孩子,
),
);
},
),
填充物(
填充:边缘设置。全部(10),
子:文本(
_value.toString(),
样式:TextStyle(字体大小:20),
),
),
填充物(
填充:边缘设置。全部(10),
C