【问题标题】:No Animation with AnimatedSwitcher or AnimatedOpacity没有使用 AnimatedSwitcher 或 AnimatedOpacity 的动画
【发布时间】:2020-06-13 11:35:33
【问题描述】:

我正在学习颤振,并且我正在使用动画系统。

我创建了一个单选按钮,它是一个在被点击时应该被填充的圆圈。

我创建了一个有状态的小部件类和一个状态类。

在状态类中,我构建了一个:

   GestureDetector -> Container -> AnimatedSwitcher -> _animatedWidget

_animatedWidget 是一个 Widget,当我单击时会发生变化(在 GestureDetector onTap 我做 _changeSelect)

  void _changeSelect(){
    _isSelected = !_isSelected;
      if(_isSelected){
        setState(() {
          _animatedWidget = Container(width: double.infinity,height: double.infinity,decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.black));
        });
      }
      else{
        setState(() {
          _animatedWidget = Container();          
        });
      }


  }

而且这段代码不能正常工作,它应该在整个容器中淡入淡出并在空容器中淡出,但它只是弹出并弹出(就像经典更改一样)

这是我的状态类的完整代码:


class _RadioButtonState extends State<RadioButton> {

  Widget _animatedWidget = Container();


  bool _isSelected = false;

  bool isSelected(){
    return _isSelected;
  }

  void _changeSelect(){
    _isSelected = !_isSelected;
      if(_isSelected){
        setState(() {
          _animatedWidget = Container(width: double.infinity,height: double.infinity,decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.black));
        });
      }
      else{
        setState(() {
          _animatedWidget = Container();          
        });
      }


  }

  @override
  Widget build(BuildContext context){
    return GestureDetector(
      onTap: _changeSelect,
      child:
        Container(
          width: 16.0,
          height: 16.0,
          padding: EdgeInsets.all(2.0),
          decoration: BoxDecoration(
              shape: BoxShape.circle,
              border: Border.all(width: 2.0, color: Colors.black)
          ),
          child: AnimatedSwitcher(
            duration: Duration(seconds: 1),
            child: _animatedWidget,
          )

        ),
    );
  }
}


注意:我也尝试使用 AnimatedOpacity 而不是 AnimatedSwitcher(单击时起始不透明度为 0 的完整容器增加到 1),但它甚至没有改变视图,但是,javascript 看起来在持续时间

【问题讨论】:

    标签: flutter dart flutter-layout flutter-animation


    【解决方案1】:

    这就是你要找的吗?


    Widget _animatedWidget = Container();
    
    bool _isSelected = false;
    
    bool isSelected() {
      return _isSelected;
    }
    
    void _changeSelect() {
      _isSelected = !_isSelected;
      if (_isSelected) {
        setState(() {
          _animatedWidget = Container(
            key: ValueKey(1),
            width: double.infinity,
            height: double.infinity,
            decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.black),
          );
        });
      } else {
        setState(() {
          _animatedWidget = Container(
            key: ValueKey(2),
          );
        });
      }
    }
    
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(),
        body: Center(
          child: GestureDetector(
            onTap: _changeSelect,
            child: Container(
                width: 66.0,
                height: 66.0,
                padding: EdgeInsets.all(2.0),
                decoration: BoxDecoration(shape: BoxShape.circle, border: Border.all(width: 2.0, color: Colors.black)),
                child: AnimatedSwitcher(
                  duration: Duration(seconds: 1),
                  child: _animatedWidget,
                )),
          ),
        ),
      );
    }
    

    【讨论】:

    • 哦,所以我做错的只是没有把钥匙放在容器里?你能简要解释一下为什么钥匙很重要吗?谢谢
    • 是的,这是您的代码的主要问题,实际上AnimatedSwitcher 只能区分其子元素,如果它们具有不同的Keys,两个具有不同属性的小部件不会被视为不同,除非它们具有不同的键,类似地,如果两个具有完全相同属性的小部件具有不同的键,则它们可以被认为是不同的。希望解释:)
    猜你喜欢
    • 2020-01-01
    • 2019-12-24
    • 2019-05-26
    • 2020-01-01
    • 2014-02-04
    • 2017-05-24
    • 2021-07-03
    • 1970-01-01
    • 2015-12-30
    相关资源
    最近更新 更多