AnimatedWidget与AnimatedBuilder:Flutter在鸿蒙平台复用动画逻辑
作者付文龙红目香薰仓库地址https://gitcode.com/feng8403000/FlutterfromBeginnertoAdvancedForHarmonyOS.git联系邮箱372699828qq.com概述在Flutter动画开发中AnimatedWidget和AnimatedBuilder是两种重要的动画组件复用方式。它们都能够帮助开发者将动画逻辑与UI代码分离提高代码的复用性和可维护性。AnimatedWidget核心概念什么是AnimatedWidgetAnimatedWidget是一个抽象类它继承自StatefulWidget用于封装动画逻辑。通过继承AnimatedWidget可以将动画相关的代码抽取到一个独立的组件中实现动画逻辑的复用。创建AnimatedWidgetclassFadeWidgetextendsAnimatedWidget{constFadeWidget({super.key,requiredAnimationdoubleanimation,requiredthis.child,}):super(listenable:animation);finalWidgetchild;Animationdoubleget_animationlistenableasAnimationdouble;overrideWidgetbuild(BuildContextcontext){returnOpacity(opacity:_animation.value,child:child,);}}AnimatedWidget的使用classAnimatedWidgetExampleextendsStatefulWidget{constAnimatedWidgetExample({super.key});overrideStateAnimatedWidgetExamplecreateState()_AnimatedWidgetExampleState();}class_AnimatedWidgetExampleStateextendsStateAnimatedWidgetExamplewithSingleTickerProviderStateMixin{lateAnimationController_controller;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.repeat(reverse:true);}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(AnimatedWidget示例)),body:Center(child:FadeWidget(animation:_controller,child:constFlutterLogo(size:200),),),);}}AnimatedBuilder核心概念什么是AnimatedBuilderAnimatedBuilder是一个便捷的动画构建器它接收一个builder回调函数在动画值变化时重新构建UI。AnimatedBuilder不需要创建新类可以直接在代码中使用。创建AnimatedBuilderAnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.scale(scale:0.5_controller.value*0.5,child:child,);},child:constFlutterLogo(size:200),)AnimatedBuilder的使用classAnimatedBuilderExampleextendsStatefulWidget{constAnimatedBuilderExample({super.key});overrideStateAnimatedBuilderExamplecreateState()_AnimatedBuilderExampleState();}class_AnimatedBuilderExampleStateextendsStateAnimatedBuilderExamplewithSingleTickerProviderStateMixin{lateAnimationController_controller;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.repeat(reverse:true);}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(AnimatedBuilder示例)),body:Center(child:AnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.scale(scale:0.5_controller.value*0.5,child:child,);},child:constFlutterLogo(size:200),),),);}}AnimatedWidget与AnimatedBuilder对比特性AnimatedWidgetAnimatedBuilder创建方式需要创建新类直接使用builder回调复用性高适合通用动画组件低适合一次性使用代码量较多较少适用场景通用动画组件封装临时动画效果性能需要创建新组件实例直接回调更轻量灵活性固定的动画逻辑灵活的动画逻辑使用AnimatedBuilder优化性能传递child参数将不变的子Widget传递给child参数可以避免不必要的重建AnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.scale(scale:_scaleAnimation.value,child:child,);},child:constFlutterLogo(size:100),)组合多个动画AnimatedBuilder可以方便地组合多个动画AnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.translate(offset:Offset(_slideAnimation.value,0),child:Opacity(opacity:_fadeAnimation.value,child:child,),);},child:constFlutterLogo(size:100),)使用AnimatedWidget封装通用组件封装淡入动画组件classFadeInAnimationextendsAnimatedWidget{constFadeInAnimation({super.key,requiredAnimationdoubleanimation,requiredthis.child,}):super(listenable:animation);finalWidgetchild;Animationdoubleget_animationlistenableasAnimationdouble;overrideWidgetbuild(BuildContextcontext){returnOpacity(opacity:_animation.value,child:child,);}}封装缩放动画组件classScaleAnimationextendsAnimatedWidget{constScaleAnimation({super.key,requiredAnimationdoubleanimation,requiredthis.child,}):super(listenable:animation);finalWidgetchild;Animationdoubleget_animationlistenableasAnimationdouble;overrideWidgetbuild(BuildContextcontext){returnTransform.scale(scale:_animation.value,child:child,);}}复杂动画场景组合AnimatedWidgetclassComplexAnimationextendsStatefulWidget{constComplexAnimation({super.key});overrideStateComplexAnimationcreateState()_ComplexAnimationState();}class_ComplexAnimationStateextendsStateComplexAnimationwithSingleTickerProviderStateMixin{lateAnimationController_controller;lateAnimationdouble_fadeAnimation;lateAnimationdouble_scaleAnimation;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_fadeAnimationCurvedAnimation(parent:_controller,curve:Curves.easeInOut);_scaleAnimationTweendouble(begin:0.5,end:1).animate(CurvedAnimation(parent:_controller,curve:Curves.easeOut),);_controller.repeat(reverse:true);}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(复杂动画组合)),body:Center(child:FadeInAnimation(animation:_fadeAnimation,child:ScaleAnimation(animation:_scaleAnimation,child:constFlutterLogo(size:200),),),),);}}使用AnimatedBuilder实现复杂动画classComplexAnimatedBuilderextendsStatefulWidget{constComplexAnimatedBuilder({super.key});overrideStateComplexAnimatedBuildercreateState()_ComplexAnimatedBuilderState();}class_ComplexAnimatedBuilderStateextendsStateComplexAnimatedBuilderwithSingleTickerProviderStateMixin{lateAnimationController_controller;lateAnimationdouble_rotationAnimation;lateAnimationdouble_scaleAnimation;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:3),vsync:this,);_rotationAnimationTweendouble(begin:0,end:2*pi).animate(CurvedAnimation(parent:_controller,curve:Curves.linear),);_scaleAnimationTweendouble(begin:0.5,end:1.5).animate(CurvedAnimation(parent:_controller,curve:Curves.easeInOut),);_controller.repeat();}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(复杂AnimatedBuilder)),body:Center(child:AnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.rotate(angle:_rotationAnimation.value,child:Transform.scale(scale:_scaleAnimation.value,child:child,),);},child:constFlutterLogo(size:200),),),);}}性能优化最佳实践使用AnimatedBuilder避免重建// 不推荐每次动画都会重建FlutterLogoAnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.scale(scale:_controller.value,child:constFlutterLogo(size:100),);},)// 推荐FlutterLogo只创建一次AnimatedBuilder(animation:_controller,builder:(context,child){returnTransform.scale(scale:_controller.value,child:child,);},child:constFlutterLogo(size:100),)使用RepaintBoundary隔离重绘AnimatedBuilder(animation:_controller,builder:(context,child){returnRepaintBoundary(child:Transform.scale(scale:_controller.value,child:child,),);},child:constFlutterLogo(size:100),)鸿蒙平台注意事项在鸿蒙平台使用AnimatedWidget和AnimatedBuilder时需要注意以下几点组件创建开销AnimatedWidget每次创建都会产生组件实例开销对于简单动画优先使用AnimatedBuilder性能测试在鸿蒙真机上测试复杂动画的流畅度资源释放确保AnimationController在dispose方法中正确释放动画复杂度避免在动画回调中进行大量计算总结AnimatedWidget和AnimatedBuilder是Flutter动画系统中两种重要的复用方式。AnimatedWidget适合封装通用的动画组件具有较高的复用性AnimatedBuilder适合快速实现临时动画效果更加轻量灵活。在实际开发中应根据具体场景选择合适的方式并注意性能优化确保动画在鸿蒙平台上流畅运行。

相关新闻

Windows Defender彻底卸载指南:如何安全移除系统自带杀毒软件

Windows Defender彻底卸载指南:如何安全移除系统自带杀毒软件

Windows Defender彻底卸载指南:如何安全移除系统自带杀毒软件 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirr…

2026/7/21 9:33:31阅读更多 →
NomNom存档编辑器终极指南:解锁《无人深空》无限可能

NomNom存档编辑器终极指南:解锁《无人深空》无限可能

NomNom存档编辑器终极指南:解锁《无人深空》无限可能 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item indiv…

2026/7/21 9:33:31阅读更多 →
平头哥 BeagleV-Ahead TH1520 RISC-V 高性能开发板开箱硬件评测

平头哥 BeagleV-Ahead TH1520 RISC-V 高性能开发板开箱硬件评测

BeagleV-Ahead开箱硬件讲解 BeagleV-Ahead开箱介绍 非常感谢 中国杭州平头哥半导体优先公司 和 Beagle社区给予我们 全球首款高性能 TH1520 RISC-V SBC开发板 BeagleV-Ahead评测工作,我们将围绕 开发板 外观 ,板载功能接口,系统启动系统初体…

2026/7/21 9:31:31阅读更多 →
小微企业无需搭建官网!一张壹脉智能名片,搭建专属线上品牌展厅

小微企业无需搭建官网!一张壹脉智能名片,搭建专属线上品牌展厅

对于小微企业、初创团队、个体商家而言,搭建企业官网一直是一大难题:官网搭建成本高、周期长、运维复杂、需要专人维护,每年还要持续投入域名、服务器费用,性价比极低。但没有官网,企业就缺少正规的线上品牌展示窗口&a…

2026/7/22 5:24:39阅读更多 →
深入解析C2000 eHRPWM:从寄存器到电机控制实战

深入解析C2000 eHRPWM:从寄存器到电机控制实战

1. 项目概述与eHRPWM核心价值在电机控制、数字电源或者任何需要精确控制能量输出的嵌入式系统里,PWM(脉冲宽度调制)技术是工程师手中的“瑞士军刀”。我们通过调节一个方波信号高电平的持续时间(脉宽)占整个周期的比例…

2026/7/22 5:24:39阅读更多 →
C++ std::list 底层原理与高效应用场景全解析

C++ std::list 底层原理与高效应用场景全解析

1. 项目概述:为什么我们需要深入理解std::list?在C的日常开发中,std::vector因其连续内存和缓存友好的特性,常常是序列容器的首选。然而,当你的应用场景频繁涉及序列中间位置的插入与删除操作时,一股“性能…

2026/7/22 5:24:39阅读更多 →
VRChat改模Unity版本选择指南:2019与2022核心差异与实战配置

VRChat改模Unity版本选择指南:2019与2022核心差异与实战配置

1. 项目概述:为什么VRChat改模需要关注Unity版本?如果你在VRChat社区里混过一段时间,或者自己尝试过把心仪的模型导入游戏,那你肯定绕不开一个词:Unity。VRChat这个平台,本质上就是一个基于Unity引擎构建的…

2026/7/22 5:24:39阅读更多 →
使用Visual C++为Authorware 7开发DLL:从原理到部署的完整指南

使用Visual C++为Authorware 7开发DLL:从原理到部署的完整指南

1. 项目概述与核心价值如果你是一位还在维护或开发Authorware 7项目的多媒体工程师,那么你大概率会遇到一个经典困境:Authorware自带的脚本功能(比如它的计算图标)在处理复杂逻辑、高性能计算或者与特定硬件(如串口、U…

2026/7/22 5:24:39阅读更多 →
MFC实战:从零构建Windows记事本,掌握桌面开发核心

MFC实战:从零构建Windows记事本,掌握桌面开发核心

1. 项目概述:为什么选择MFC来写一个记事本?如果你是一个有一定C基础,但主要停留在控制台程序或者标准库层面的开发者,想迈入Windows桌面应用开发的大门,那么“用MFC写一个记事本”这个项目,绝对是一个教科书…

2026/7/22 5:22:39阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →