You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:11:10