动画监听与状态回调: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监听状态变化可以在动画执行过程中执行自定义逻辑。在实际应用中动画监听常用于登录跳转、进度更新、链式动画等场景。掌握动画监听的使用方式能够为应用增添更加丰富的交互体验。

相关新闻

NPS Enhanced高级功能:P2P直连与私密代理的应用场景与配置方法

NPS Enhanced高级功能:P2P直连与私密代理的应用场景与配置方法

NPS Enhanced高级功能:P2P直连与私密代理的应用场景与配置方法 【免费下载链接】nps NPS Enhanced — Lightweight intranet tunneling and reverse proxy with Web UI | NPS 内网穿透 反向代理 增强版 全修 新版 二开 项目地址: https://gitcode.com/gh_mirrors/…

2026/7/22 20:31:39阅读更多 →
FCGF:如何用全卷积几何特征实现3D点云快速精准配准?完整指南

FCGF:如何用全卷积几何特征实现3D点云快速精准配准?完整指南

FCGF:如何用全卷积几何特征实现3D点云快速精准配准?完整指南 【免费下载链接】FCGF Fully Convolutional Geometric Features: Fast and accurate 3D features for registration and correspondence. 项目地址: https://gitcode.com/gh_mirrors/fc/FCG…

2026/7/22 20:31:39阅读更多 →
Unity Multiplayer序列化技术详解:自定义数据类型与高效数据传输

Unity Multiplayer序列化技术详解:自定义数据类型与高效数据传输

Unity Multiplayer序列化技术详解:自定义数据类型与高效数据传输 【免费下载链接】com.unity.multiplayer.docs [ARCHIVED] Open Source documentation for Unity Multiplayer, which includes Netcode for GameObjects, the Unity Transport Package, Multiplayer …

2026/7/22 20:29:39阅读更多 →
springboot共享办公室在线预约与租赁系统

springboot共享办公室在线预约与租赁系统

共享办公室在线预约与租赁系统的选题背景随着全球经济的快速发展和创业浪潮的兴起,灵活办公模式逐渐成为企业和个人的主流需求。共享办公室(Coworking Space)作为一种新型办公模式,通过提供灵活的租赁方式、完善的设施和社群化服务…

2026/7/22 21:11:47阅读更多 →
【SOTA级AI工程规范】:基于MLflow+DVC+Cookiecutter的6层可审计目录架构(含企业级模板下载权限限时开放)

【SOTA级AI工程规范】:基于MLflow+DVC+Cookiecutter的6层可审计目录架构(含企业级模板下载权限限时开放)

更多请点击: https://kaifayun.com 第一章:SOTA级AI工程规范的核心理念与演进脉络 SOTA级AI工程规范并非静态标准,而是融合算法前沿性、系统鲁棒性、可维护性与合规性的动态实践体系。其核心理念植根于三个不可分割的支柱:**可复…

2026/7/22 21:11:47阅读更多 →
longcat完全指南:探索6种终端环境下的长猫渲染效果

longcat完全指南:探索6种终端环境下的长猫渲染效果

longcat完全指南:探索6种终端环境下的长猫渲染效果 【免费下载链接】longcat Looooooooooooooooooooooooooooooooooooooooooooooong cat 项目地址: https://gitcode.com/gh_mirrors/lo/longcat longcat是一款能够在不同终端环境下渲染长猫图像的有趣工具&…

2026/7/22 21:11:47阅读更多 →
Gizeh实战案例:用简单代码绘制惊艳的几何艺术

Gizeh实战案例:用简单代码绘制惊艳的几何艺术

Gizeh实战案例:用简单代码绘制惊艳的几何艺术 【免费下载链接】gizeh Simple Vector Graphics for Python 项目地址: https://gitcode.com/gh_mirrors/gi/gizeh Gizeh是一款专为Python设计的简单矢量图形库,让开发者能够用少量代码创建出精美的几…

2026/7/22 21:11:47阅读更多 →
TorToolkit-Telegram高级功能:Mega下载、Instagram解析与压缩包处理

TorToolkit-Telegram高级功能:Mega下载、Instagram解析与压缩包处理

TorToolkit-Telegram高级功能:Mega下载、Instagram解析与压缩包处理 【免费下载链接】TorToolkit-Telegram Most versatile Telegram torrent, direct-link, mega, and youtube-dl bot. Uploads to various cloud storage like Gdrive, Mega, Telegram, etc. 项目…

2026/7/22 21:11:47阅读更多 →
AI周报生成器选型红皮书(附12款工具实测对比表|含准确率/响应延迟/合规性三维度评分)

AI周报生成器选型红皮书(附12款工具实测对比表|含准确率/响应延迟/合规性三维度评分)

更多请点击: https://codechina.net 第一章:AI周报生成器选型红皮书导论 在企业级AI应用落地加速的当下,自动化周报生成已成为技术团队效能管理的关键环节。本导论不预设技术栈偏好,而是聚焦于构建一套可复用、可验证、可审计的选…

2026/7/22 21:09:47阅读更多 →
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/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/22 18:55:50阅读更多 →