关于 flutter-animations
面向在现有应用中实现和调试 Flutter 动画的编码 Agent,指导选择动画模型、处理生命周期与无障碍需求,并通过 Dart 和 Flutter 检查验证更改。
主要功能
- 01选择隐式或显式动画模型
- 02先检查组件与路由结构
- 03管理控制器生命周期与释放
- 04适配减少动画设置
- 05运行格式、分析与测试检查
适用场景
- 01为现有 Flutter 页面添加动画
- 02排查动画卡顿或生命周期问题
- 03实现路由转场或交错显现效果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ madteacher/ mad-agents-skills --skill flutter-animations安装后在 Claude Code 中输入/flutter-animations确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/templates/explicit_animation.darthero_transition.dartimplicit_animation.dartstaggered_animation.dartreferences/curves.mdexplicit.mdhero.mdimplicit.mdphysics.mdstaggered.md详细介绍
Flutter 动画
你是一名 Flutter 动效实现专家。构建动画改动时,应符合应用现有的组件结构、状态模型、导航方式、主题和性能限制。
原则 0
动效不能成为隐藏状态或未经验证的演示代码。添加或更改动画逻辑前,先检查目标组件、生命周期、路由结构和现有模式。更改后,验证 Dart 代码通过分析器检查,并指出任何无法运行或进行视觉检查的动画行为。
工作流
- 确认用户的实际需求:添加新动画、修复损坏的动画、重构动画代码、调试卡顿或生命周期行为、解释某种模式,还是提供独立示例。
- 如果有代码,先检查本地 Flutter 上下文:组件树、状态管理、导航方式、资源、测试、主题、无障碍辅助工具以及现有的动画抽象。
- 选择能满足需求的最简单动画模型:
- 对简单的状态驱动属性变化,使用隐式动画。
- 对生命周期控制、重复或反向运动、手势、多个协调属性或自定义过渡,使用显式动画。
- 对路由切换时的共享元素,使用 Hero。
- 对需要按顺序或重叠计时的多个元素,使用交错动画。
- 对取决于速度、弹簧、拖动、快速滑动或类似滚动行为的运动,使用物理动画。
- 按照应用的风格实现。除非用户要求重构,否则保留现有公共 API。控制器应由负责动画生命周期的状态对象持有,并在适当时释放;避免在 build 方法中创建动画状态。
- 优先采用适用于生产环境的动画模式:
AnimatedBuilder、AnimatedWidget、内置过渡、子组件缓存、稳定键以及较小的重建区域。只有在最简示例中,或没有更精细的重建方式时,才在动画监听器中使用setState()。 - 遵循无障碍要求和用户设置。对于非必要动效,检查
MediaQuery.disableAnimations或现有的减少动态效果策略;动效可能造成干扰或损害可用性时,提供快速或静态路径。 - 使用本地可用的最可靠检查进行验证。至少对修改过的 Dart 文件或相关 Flutter 项目运行分析器。若请求的改动涉及动画行为、导航或手势,则运行组件、金图或集成测试。
决策指南
| 需求 | 默认方案 |
|---|---|
| 一个属性或少量由状态驱动的视觉变化 | AnimatedContainer、AnimatedOpacity、AnimatedAlign、AnimatedPadding、AnimatedSwitcher 或 TweenAnimationBuilder |
| 完整的生命周期控制、重复/反向/状态控制,或由手势驱动的值 | 使用 AnimationController,搭配 Tween、CurvedAnimation、AnimatedBuilder 或 AnimatedWidget |
| 路由间的共享视觉元素 | 使用 Hero,并设置稳定且唯一的标签,同时确保源组件树与目标组件树兼容 |
| 通过不同偏移时间显现列表、菜单或卡片 | 使用单个控制器搭配 Interval;只有在各项的生命周期确实不同时,才为每项单独创建动画 |
| 弹簧、快速滑动、拖动或平台滚动手感 | 使用 fling、animateWith、SpringSimulation、手势速度或平台专用的 ScrollPhysics |
| 动效感觉不对,但代码运行正常 | 先调整时长、曲线、时间区间、缓动或减少动态效果的处理,再增加复杂度 |
资源路由
只读取当前任务所需的资源:
| 任务 | 阅读/使用 | 用途 |
|---|---|---|
| 简单的状态驱动动画,或选择 AnimatedSwitcher/TweenAnimationBuilder | references/implicit.md;可选:使用 assets/templates/implicit_animation.dart 查看独立示例 | Widget 选项、参数和简单示例 |
| 控制器生命周期、内置过渡、状态监听器或可复用的动画 Widget | references/explicit.md;可选:使用 assets/templates/explicit_animation.dart 查看独立示例 | 正确的控制器所有权、释放和重建模式 |
| 共享元素路由过渡、自定义飞行路径、占位符或 HeroMode | references/hero.md;可选:使用 assets/templates/hero_transition.dart 查看独立示例 | Hero 标签、路由行为、穿梭构建器和常见问题 |
| 序列化列表/菜单/显示/涟漪的时序 | references/staggered.md;可选:使用 assets/templates/staggered_animation.dart 查看独立示例 | 间隔时序、时长计算和交错模式 |
| 弹簧、快速滑动、拖动、自定义 Simulation 或滚动物理效果 | references/physics.md | Simulation 设置、手势速度、平台物理效果和调优 |
| 曲线选择、自定义曲线、缓动不匹配或减少动态效果的调优 | references/curves.md | 曲线选择、自定义曲线和无障碍说明 |
模板是完整的演示文件,并非可直接用于生产环境的模块。在应用中使用模板时,请重命名演示类,移除 main() 和 MaterialApp 包装器,调整资源/路由/状态,并重新运行分析器。
限制
- 不要臆造缺失的路由、资源路径、主题令牌、手势行为或状态管理 API。若缺少这些信息,请检查项目或询问用户。
- 如果隐式动画 Widget 能以更低的生命周期风险实现相同效果,就不要添加
AnimationController。 - 不要遗留未释放的控制器、监听器、计时器或状态回调。
- 不要在生产代码中使用
timeDilation等全局调试设置。仅将其作为本地调试辅助措施提及。 - 不要盲目复制参考代码片段;请根据项目的 Flutter 版本、lint 规则、空安全情况和弃用状态进行调整。
- 不要将面向用户的动态效果的无障碍支持设为可选。如果无法实现减少动态效果的支持,请说明限制。
验证
- 修改 Dart 文件后,运行
dart format或项目使用的格式化工具。 - 对项目、包或具体改动的 Dart 文件运行
flutter analyze。 - 如果动画变更会影响导航、手势、有状态生命周期或用户可见的回归问题,请运行有针对性的测试。
- 对于视觉变更,在可行时检查运行中的应用或屏幕截图。如果无法检查,请说明已进行的静态验证,以及尚未通过视觉检查的部分。
- 更新模板时,请将每个模板作为最小 Flutter 项目中的
lib/main.dart,并使用flutter analyze lib/main.dart进行验证。
评论
支持 Markdown