美文网首页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