Flutter 每次我进入文本字段时,颤振动画切换器都会重建

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

在下面的代码中,我希望AnimatedSwitcher下的文本仅在按下FlatButton时才设置动画,但它会为我在TextField中输入的每个角色设置动画。由于TextField的onChanged方法中有一个setState,因此每次输入角色时都会触发动画

如何防止AnimatedSwitcher在每次调用setState方法时重建,并且仅在其子对象的值已更新时重建

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