动画监听与状态回调:Flutter在鸿蒙平台响应动画状态变化
作者付文龙红目香薰仓库地址https://gitcode.com/feng8403000/FlutterfromBeginnertoAdvancedForHarmonyOS.git联系邮箱372699828qq.com概述在Flutter动画系统中监听动画的状态变化和值变化是实现复杂交互的关键。通过addListener和addStatusListener可以在动画执行过程中执行自定义逻辑实现更加灵活的动画控制。动画监听核心概念为什么需要监听在实际开发中我们经常需要在动画开始时执行初始化操作在动画结束时执行清理或跳转逻辑在动画过程中实时更新UI或数据根据动画状态执行不同的业务逻辑动画状态说明状态说明dismissed动画在起点lowerBoundforward动画正向播放中reverse动画反向播放中completed动画在终点upperBoundaddListener值监听基本用法addListener用于监听动画值的变化在每一帧都会被调用_controller.addListener((){print(当前值:${_controller.value});});值监听实际应用classValueListenerExampleextendsStatefulWidget{constValueListenerExample({super.key});overrideStateValueListenerExamplecreateState()_ValueListenerExampleState();}class_ValueListenerExampleStateextendsStateValueListenerExamplewithSingleTickerProviderStateMixin{lateAnimationController_controller;double _currentValue0;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.addListener((){setState((){_currentValue_controller.value;});});}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(值监听示例)),body:Column(children:[Text(当前值:${_currentValue.toStringAsFixed(2)}),constSizedBox(height:20),Container(width:200,height:20,color:Colors.grey[300],child:Container(width:_currentValue*200,height:20,color:Colors.blue,),),constSizedBox(height:20),ElevatedButton(onPressed:()_controller.forward(from:0),child:constText(播放动画),),],),);}}移除值监听void_listener(){setState((){_currentValue_controller.value;});}overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.addListener(_listener);}overridevoiddispose(){_controller.removeListener(_listener);_controller.dispose();super.dispose();}addStatusListener状态监听基本用法addStatusListener用于监听动画状态的变化_controller.addStatusListener((status){switch(status){caseAnimationStatus.dismissed:print(动画在起点);break;caseAnimationStatus.forward:print(正向播放中);break;caseAnimationStatus.reverse:print(反向播放中);break;caseAnimationStatus.completed:print(动画在终点);break;}});状态监听实际应用classStatusListenerExampleextendsStatefulWidget{constStatusListenerExample({super.key});overrideStateStatusListenerExamplecreateState()_StatusListenerExampleState();}class_StatusListenerExampleStateextendsStateStatusListenerExamplewithSingleTickerProviderStateMixin{lateAnimationController_controller;String_statusdismissed;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.addStatusListener((status){setState((){_statusstatus.toString().split(.)[1];});});}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(状态监听示例)),body:Column(children:[Text(当前状态:$_status),constSizedBox(height:20),FadeTransition(opacity:_controller,child:constFlutterLogo(size:200),),constSizedBox(height:20),Row(mainAxisAlignment:MainAxisAlignment.center,children:[ElevatedButton(onPressed:_controller.forward,child:constText(正向)),constSizedBox(width:8),ElevatedButton(onPressed:_controller.reverse,child:constText(反向)),constSizedBox(width:8),ElevatedButton(onPressed:_controller.reset,child:constText(重置)),],),],),);}}移除状态监听void_statusListener(AnimationStatusstatus){setState((){_statusstatus.toString().split(.)[1];});}overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.addStatusListener(_statusListener);}overridevoiddispose(){_controller.removeStatusListener(_statusListener);_controller.dispose();super.dispose();}动画完成回调使用whenCompletewhenComplete是一个便捷的方法在动画完成时执行回调_controller.forward().whenComplete((){print(动画完成);Navigator.push(context,MaterialPageRoute(builder:(context)constNextPage()));});使用addStatusListener监听completed状态_controller.addStatusListener((status){if(statusAnimationStatus.completed){print(动画完成);Navigator.push(context,MaterialPageRoute(builder:(context)constNextPage()));}});组合监听同时监听值和状态classCombinedListenerExampleextendsStatefulWidget{constCombinedListenerExample({super.key});overrideStateCombinedListenerExamplecreateState()_CombinedListenerExampleState();}class_CombinedListenerExampleStateextendsStateCombinedListenerExamplewithSingleTickerProviderStateMixin{lateAnimationController_controller;String_statusdismissed;double _value0;overridevoidinitState(){super.initState();_controllerAnimationController(duration:constDuration(seconds:2),vsync:this,);_controller.addListener((){setState((){_value_controller.value;});});_controller.addStatusListener((status){setState((){_statusstatus.toString().split(.)[1];});});}overridevoiddispose(){_controller.dispose();super.dispose();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(组合监听示例)),body:Column(children:[Text(状态:$_status, 值:${_value.toStringAsFixed(2)}),constSizedBox(height:20),FadeTransition(opacity:_controller,child:constFlutterLogo(size:200),),constSizedBox(height:20),ElevatedButton(onPressed:()_controller.forward(from:0),child:constText(播放动画),),],),);}}监听在实际场景中的应用场景1登录动画void_handleLogin(){_controller.forward().whenComplete((){Navigator.pushReplacement(context,MaterialPageRoute(builder:(context)constHomePage()),);});}场景2进度动画_controller.addListener((){setState((){_progress_controller.value*100;});});_controller.addStatusListener((status){if(statusAnimationStatus.completed){setState((){_isCompletetrue;});}});场景3链式动画_controller.addStatusListener((status){if(statusAnimationStatus.completed){_secondController.forward();}});监听性能优化避免在监听器中进行复杂计算// 不推荐_controller.addListener((){// 复杂计算_result_complexCalculation(_controller.value);setState((){});});// 推荐将计算移到动画外部使用AnimatedBuilder代替addListener对于UI更新优先使用AnimatedBuilder// 不推荐_controller.addListener((){setState((){});});overrideWidgetbuild(BuildContextcontext){returnOpacity(opacity:_controller.value,child:constFlutterLogo(size:100),);}// 推荐AnimatedBuilder(animation:_controller,builder:(context,child){returnOpacity(opacity:_controller.value,child:child,);},child:constFlutterLogo(size:100),)鸿蒙平台注意事项在鸿蒙平台使用动画监听时需要注意以下几点及时移除监听器在dispose方法中移除所有监听器防止内存泄漏避免内存泄漏确保监听器中没有持有对State的强引用性能测试在鸿蒙真机上测试监听回调的执行效率线程安全确保监听器中的操作是线程安全的总结动画监听是Flutter动画系统中实现复杂交互的关键机制。通过addListener监听值变化和addStatusListener监听状态变化可以在动画执行过程中执行自定义逻辑。在实际应用中动画监听常用于登录跳转、进度更新、链式动画等场景。掌握动画监听的使用方式能够为应用增添更加丰富的交互体验。

相关新闻

从“工具堆砌”到“全链路闭环”:金融级 DevOps工具在信创环境下的架构演进与落地实践(2026)

从“工具堆砌”到“全链路闭环”:金融级 DevOps工具在信创环境下的架构演进与落地实践(2026)

在 InfoQ 或各类架构师峰会上,我们经常听到关于“敏捷”、“云原生”的宏大叙事。但对于身处金融核心系统或关键基础设施领域的架构师来说,现实的引力往往更沉重。 当前,在信创(国产化)替代的硬指标下,许多…

2026/10/20 4:48:45 阅读更多 →
2026人形机器人产业终局研判:从技术收敛到数据闭环,全栈龙头开启产业化新纪元

2026人形机器人产业终局研判:从技术收敛到数据闭环,全栈龙头开启产业化新纪元

2026年是人形机器人产业技术收敛、量产突围、数据闭环落地的关键转折年。行业彻底告别此前依靠单点技术展示、样机性能比拼的0-1原型探索阶段,全面迈入1-10规模化量产、场景商业化落地、数据迭代升级的全新周期。据行业权威数据,2026年国内人形机器人整机…

2026/10/20 6:06:54 阅读更多 →
如何用Reark构建响应式Android应用:从理论到实战

如何用Reark构建响应式Android应用:从理论到实战

如何用Reark构建响应式Android应用:从理论到实战 【免费下载链接】reark RxJava architecture library for Android 项目地址: https://gitcode.com/gh_mirrors/re/reark Reark是一个基于RxJava的Android架构库,旨在帮助开发者构建高效、可维护的…

2026/10/20 4:14:20 阅读更多 →

最新新闻

海康球机ISAPI开发指南:破解摘要认证与三态报文解析

海康球机ISAPI开发指南:破解摘要认证与三态报文解析

简介:本资源是面向安防系统集成开发者、嵌入式工程师及智能视频平台研发人员的《ISAPI开发手册(海康球形摄像机)》官方技术文档,聚焦基于HTTP/REST架构的智能安全API对接实践,解决海康威视PTZ球机设备与上位平台间的认…

2026/10/20 12:27:16 阅读更多 →
Parler-TTS Mini技术渊源:Stability AI合成标注论文与高保真TTS开源复现指南

Parler-TTS Mini技术渊源:Stability AI合成标注论文与高保真TTS开源复现指南

【免费下载链接】parler_tts_mini_v0.1 项目地址: https://ai.gitcode.com/hf_mirrors/AI-ModelScope/parler_tts_mini_v0.1 点击查看 免费下载 Parler-TTS Mini v0.1 是一个轻量级文本转语音(TTS)模型,基于 Stability AI 的合成…

2026/10/20 12:27:16 阅读更多 →
自己动手写RTree:Java实现空间索引的核心算法与避坑实践

自己动手写RTree:Java实现空间索引的核心算法与避坑实践

简介:面向地理信息、数据库与计算机图形学场景,这份Java实现的RTree代码包展示了多维空间索引的完整构建方式,可高效完成点、矩形等几何对象的存储与检索,适合处理海量空间数据、研究索引结构或进行二次开发的工程师与研究人员。压…

2026/10/20 12:27:16 阅读更多 →
一次回车背后的网络协议全链路解析:从物理层到HTTP/3

一次回车背后的网络协议全链路解析:从物理层到HTTP/3

1. 这个问题到底在问什么?——从一次回车键按下开始的真实链路你有没有想过,当手指按下回车键的那一刻,浏览器里那个看似简单的域名输入框,其实已经悄然启动了一整套精密协作的通信系统?这不是一个孤立动作&#xff0c…

2026/10/20 12:27:16 阅读更多 →
dsoframer.ocx 部署指南:兼容 Office 2016 的版本选择与注册

dsoframer.ocx 部署指南:兼容 Office 2016 的版本选择与注册

简介:DSOFramer.ocx控件最新版是一份面向WinForm开发者的Office文档嵌入组件资源,重点解决在应用程序窗体内部直接查看与编辑Word、Excel等文档的需求,并已适配Office 2016,避免文档跳出为独立Office窗口而破坏界面统一性。压缩包…

2026/10/20 12:27:15 阅读更多 →
水风光互补调度与净现值计算:MATLAB资源包实战指南

水风光互补调度与净现值计算:MATLAB资源包实战指南

简介:本资源面向计算机、电子信息工程、数学等专业的大学生及新能源调度方向研究者,提供水风光互补调度系统的净现值计算与不同网格装机容量、出力系数影响分析的完整MATLAB实现方案,可用于课程设计、期末大作业与毕业设计。压缩包共18个文件…

2026/10/20 12:26:14 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →