HydratedBloc在代码一致的两个Bloc中产生不一致结果的问题
待办应用HydratedBloc状态持久化问题解决
问题1:TasksBloc需手动转换Map类型,HabitsBloc无需
- 根因:两个Bloc的序列化/反序列化逻辑存在隐性差异,TasksBloc的初始状态序列化后生成了
Map<dynamic, dynamic>,而HabitsBloc输出的是严格Map<String, dynamic>。 - 解决:
- 统一两个Bloc的
toJson实现,确保所有键都为字符串类型,避免动态类型键值。 - 检查
TasksInitial的toJson方法,确认返回的映射中键均为字符串,从源头避免非字符串键的Map生成。
- 统一两个Bloc的
问题2:首次启动TasksBloc读取null报错,重启后正常
- 根因:TasksInitial状态的序列化存储时机晚于TasksBloc的初始加载操作,首次启动时存储中无数据,返回null触发报错;重启时存储已存在初始状态数据,因此正常加载。
- 解决:
- 在TasksBloc的
fromJson中处理null边界情况,直接返回默认初始状态:@override TasksState fromJson(Map<String, dynamic> json) { if (json == null || json.isEmpty) { return TasksInitial(tasks: []); // 替换为你的默认初始任务列表 } // 原有转换逻辑 } - 统一Bloc初始化时机:在应用启动阶段(如
main函数中)提前初始化TasksBloc和HabitsBloc,触发初始状态的序列化存储,避免后续加载时无数据。 - 确认
HydratedBloc.storage的初始化顺序:确保在所有Bloc实例化前,完成HydratedStorage.build()并赋值给HydratedBloc.storage,避免存储操作延迟。
- 在TasksBloc的
通用排查步骤
- 逐行对比
TasksBloc与HabitsBloc的toJson、fromJson方法及初始状态定义,确保逻辑完全一致。 - 验证HydratedBloc版本,排除版本差异导致的序列化行为不一致问题。
内容的提问来源于stack exchange,提问作者imclerran
相关产品推荐
相关产品推荐

