美文网首页APP & program大前端开发
Flutter-AnimatedWidget组件源码解析

Flutter-AnimatedWidget组件源码解析

作者: 阿博聊编程 | 来源:发表于2022-06-07 18:27 被阅读0次
    配图来自网络,如侵必删

    在日常的开发当中,可能会出现Flutter SDK自带的动画组件不能满足我们实际的开发需求;遇到这种情况,我们可以通过AnimatedWidget组件来自定义动画组件,这篇博客分享AnimatedWidget组件相关的内容,记录一次AnimatedWidget组件的源码解读。

    AnimatedWidget组件源码

    abstract class AnimatedWidget extends StatefulWidget {
    
      const AnimatedWidget({
        Key? key,
        required this.listenable,
      }) : assert(listenable != null),
           super(key: key);
    
      final Listenable listenable;
    
      @protected
      Widget build(BuildContext context);
    
     
      @override
      State<AnimatedWidget> createState() => _AnimatedState();
    
      @override
      void debugFillProperties(DiagnosticPropertiesBuilder properties) {
        super.debugFillProperties(properties);
        properties.add(DiagnosticsProperty<Listenable>('animation', listenable));
      }
    }
    
    class _AnimatedState extends State<AnimatedWidget> {
      @override
      void initState() {
        super.initState();
        widget.listenable.addListener(_handleChange);
      }
    
      @override
      void didUpdateWidget(AnimatedWidget oldWidget) {
        super.didUpdateWidget(oldWidget);
        if (widget.listenable != oldWidget.listenable) {
          oldWidget.listenable.removeListener(_handleChange);
          widget.listenable.addListener(_handleChange);
        }
      }
    
      @override
      void dispose() {
        widget.listenable.removeListener(_handleChange);
        super.dispose();
      }
    
      void _handleChange() {
        setState(() {
          // The listenable's state is our build state, and it changed already.
        });
      }
    
      @override
      Widget build(BuildContext context) => widget.build(context);
    }
    

    上面是AnimatedWidget组件的源码,解读如下:

    • AnimatedWidget组件,是一个有状态的组件,它里面就封装是了实现动画的模板;
    • 构造方法中的listenable对象,指的是Animation对象;
    • 重写build方法,传入一个使用动画的组件;
    • _AnimatedState.initState(),给动画设置监听器,在动画执行的过程中自动调用setState()更新状态;
    • _AnimatedState.dispose(),释放动画监听器,防止出现内存泄漏。

    通过源码的解读,我们可以发现实现自己的自定义动画还是相对简单的,只需要继承AnimatedWidget组件,然后重写build()方法。希望这篇文章对小伙伴有所帮助。

    相关文章

      网友评论

        本文标题:Flutter-AnimatedWidget组件源码解析

        本文链接:https://www.haomeiwen.com/subject/oswemrtx.html