Flutter双AnimationController初始化第二个控制器时崩溃问题咨询
崩溃核心原因
报错和AnimationController的初始化、动画配置逻辑本身无关,根因是当前State类混入的vsync提供方不匹配:
- 当前代码混入的是
SingleTickerProviderStateMixin,这个mixin的设计定位是仅支持单个绑定到当前State的Ticker(AnimationController的vsync同步源),内部会通过断言校验Ticker的绑定数量 - 当你传入
vsync: this尝试创建第二个AnimationController时,会直接触发内部的单实例校验失败,抛出你看到的owner._debugCurrentBuildTarget == this断言错误 - 报错里连带出现的
RenderErrorBox类型转换异常,是因为前面的断言失败后组件树自动渲染了错误占位节点,后续渲染流程拿到占位节点才触发的类型匹配错误,并非手势渲染逻辑本身的问题
修复方案
不需要改动原有动画的业务逻辑,直接替换State类的mixin即可:
- 将类声明上的
with SingleTickerProviderStateMixin替换为with TickerProviderStateMixinclass _GlassTypeState extends State<GlassType> with TickerProviderStateMixin { - 两个mixin的核心差异:
SingleTickerProviderStateMixin:仅支持单个Ticker实例,适合State内只有一个AnimationController的场景,会做单实例的性能优化TickerProviderStateMixin:支持创建任意数量的独立Ticker,每个AnimationController都会绑定独立的vsync源,完全适配需要配置两个独立控制器的需求
- 补全资源释放逻辑,在
dispose方法中统一释放两个控制器,避免内存泄漏:@override void dispose() { _animationController.dispose(); _opacityController.dispose(); super.dispose(); }
替换完成后原有逻辑可正常运行:
- 第一个永久循环的动画控制器,保留
_animationController.repeat(reverse: true)的调用逻辑即可 - 第二个单次执行的控制器,后续补全
Tween绑定和forward()调用逻辑也不会触发崩溃
注意:不需要修改原有的AnimatedBuilder、Tween绑定、控制器启动逻辑的代码,仅替换mixin即可解决全部报错。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

