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

GetX/Obx包裹的Widget未触发重建问题求助

问题分析与解决方案

核心问题排查与修复

1. 统计逻辑未重置初始值

completedTask函数中每次统计前没有重置completed.value为0,导致多次调用时数值持续累加,甚至可能因重复赋值相同数值(比如两次统计结果一致)而不触发UI更新。

2. TodoDb实例一致性问题

必须确保组件中使用的todoDb实例和调用completedTask的是同一个对象。如果每次创建新的TodoDb实例,Obx监听的是旧实例的completed变量,自然不会响应新实例的数值变化。


修正后的代码示例

修复completedTask函数

class TodoDb{
  Rx<int> completed=0.obs;

  Future<int> completedTask(bool isUpd) async {
    // 每次统计前重置数值,避免累加旧数据
    completed.value = 0;
    if(isUpd==false){
      await readData();
    }
    // 空值判断,避免空指针异常
    if(data != null){
      for (var e in data!) {
        if (e['isDone'] == 1) {
          completed.value += 1;
        }
      }
    }
    print(completed.value);
    return completed.value;
  }
}

确保组件与函数使用同一实例

将TodoDb实例作为组件状态变量或全局单例,保证所有操作指向同一个对象:

class YourTaskWidget extends StatefulWidget {
  @override
  State<YourTaskWidget> createState() => _YourTaskWidgetState();
}

class _YourTaskWidgetState extends State<YourTaskWidget> {
  // 全局/状态内的同一实例
  final TodoDb todoDb = TodoDb();

  @override
  void initState() {
    super.initState();
    // 组件渲染完成后执行统计
    WidgetsBinding.instance.addPostFrameCallback((_) {
      todoDb.completedTask(false);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Obx(() {
      return CircularStepProgressIndicator(
        totalSteps: todoDb.data?.length ?? 1,
        currentStep: todoDb.completed.value,
        selectedColor: Colors.yellow,
        unselectedColor: Colors.lightBlueAccent,
        padding: 0,
        width: 50,
        height: 50,
        child: const Icon(
          Icons.download_done_outlined,
          color: Colors.blueAccent,
          size: 20,
        ),
      );
    });
  }
}

额外检查点

  • 确认readData函数正确更新了TodoDb的data变量,保证统计的是最新数据库数据。
  • 若使用GetX全局状态管理,可通过Get.put(TodoDb())创建单例,确保所有页面引用同一实例。

内容的提问来源于stack exchange,提问作者Mohammed Al Shemmari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:48:36