Flutter-AnimatedWidget组件源码解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Flutter-AnimatedWidget组件源码解析

在日常的开发当中,可能会出现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()方法。希望这篇文章对小伙伴有所帮助。

目录
相关文章
|
18天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
38 0
|
18天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
29 0
|
18天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
32 0
|
2天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
7 1
|
3天前
|
Dart UED
Flutter用户交互组件
Flutter用户交互组件
9 2
|
12天前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
53 2
|
16天前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
39 5
|
13天前
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
24 1
|
17天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
17天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)

推荐镜像

更多