Flutter中await调用后Confetti Widget无法正常工作求助
问题分析与解决方案
错误原因
调用Navigator.of(context).pop()关闭弹窗后,Widget树处于临时锁定状态,此时ConfettiController监听器里调用setState()会触发setState() or markNeedsBuild() called when widget tree was locked断言错误。移除setState()后错误消失但动画不播放,核心原因是动画触发时机仍处于树锁定阶段,或是监听器逻辑缺失导致UI未同步更新。
解决方案
1. 延迟动画触发,避开Widget树锁定阶段
修改onPressed代码,用WidgetsBinding.instance.addPostFrameCallback将动画播放逻辑延迟到当前帧构建完成后执行:
TextButton( onPressed: () async { // 关闭弹窗 Navigator.of(context).pop(); EasyLoading.show(status: "Completing Task"); var res = await dbService.completeTask(comment: comment.text, docId: docId); EasyLoading.dismiss(); // 延迟到当前帧构建完成后执行动画 WidgetsBinding.instance.addPostFrameCallback((_) { controller.play(); Future.delayed(const Duration(seconds: 2), () { controller.stop(); }); }); }, )
2. 修复监听器的setState()调用逻辑
调整ConfettiController的监听器,确保仅在Widget已挂载且未处于构建阶段时调用setState():
import 'package:flutter/scheduler.dart'; // ... controller.addListener(() { // 双重校验:Widget已挂载 + 未处于构建阶段 if (mounted && !SchedulerBinding.instance.isBuilding) { setState(() { isPlaying = controller.state == ConfettiControllerState.playing; }); } });
3. 确认Confetti Widget的绑定正确性
检查页面中的ConfettiWidget是否正确绑定控制器,确保controller参数指向你的实例:
ConfettiWidget( controller: controller, // 必须关联你的ConfettiController实例 // 其他动画配置参数 )
内容的提问来源于stack exchange,提问作者prabhu r
相关产品推荐
相关产品推荐

