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

HydratedBloc在代码一致的两个Bloc中产生不一致结果的问题

待办应用HydratedBloc状态持久化问题解决

问题1:TasksBloc需手动转换Map类型,HabitsBloc无需

  • 根因:两个Bloc的序列化/反序列化逻辑存在隐性差异,TasksBloc的初始状态序列化后生成了Map<dynamic, dynamic>,而HabitsBloc输出的是严格Map<String, dynamic>。
  • 解决:
    • 统一两个Bloc的toJson实现,确保所有键都为字符串类型,避免动态类型键值。
    • 检查TasksInitial的toJson方法,确认返回的映射中键均为字符串,从源头避免非字符串键的Map生成。

问题2:首次启动TasksBloc读取null报错,重启后正常

  • 根因:TasksInitial状态的序列化存储时机晚于TasksBloc的初始加载操作,首次启动时存储中无数据,返回null触发报错;重启时存储已存在初始状态数据,因此正常加载。
  • 解决:
    1. 在TasksBloc的fromJson中处理null边界情况,直接返回默认初始状态:
      @override
      TasksState fromJson(Map<String, dynamic> json) {
        if (json == null || json.isEmpty) {
          return TasksInitial(tasks: []); // 替换为你的默认初始任务列表
        }
        // 原有转换逻辑
      }
      
    2. 统一Bloc初始化时机:在应用启动阶段(如main函数中)提前初始化TasksBloc和HabitsBloc,触发初始状态的序列化存储,避免后续加载时无数据。
    3. 确认HydratedBloc.storage的初始化顺序:确保在所有Bloc实例化前,完成HydratedStorage.build()并赋值给HydratedBloc.storage,避免存储操作延迟。

通用排查步骤

  • 逐行对比TasksBloc与HabitsBloc的toJson、fromJson方法及初始状态定义,确保逻辑完全一致。
  • 验证HydratedBloc版本,排除版本差异导致的序列化行为不一致问题。

内容的提问来源于stack exchange,提问作者imclerran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:13:24