Flutter中Hive模型新增字段报Null无法强转为int类型异常
问题原因
报错和你新代码里的字段初始化逻辑无关,根源是本地已经持久化的旧Hive数据里不存在idWrkTime字段。
你之前存在本地的EmployeeModel数据是在加这个字段之前写入的,序列化内容里根本没有对应HiveField(2)的数据,反序列化读取时Hive会给不存在的字段返回null,但你代码里把idWrkTime声明成了非空的late int类型,null转int直接触发类型转换异常。你给新创建的模型实例做初始化覆盖不到已经存在本地的老数据,所以改完创建逻辑还是会报错。
修复方法
- 给新增字段配置默认值兼容旧数据
去掉late强非空声明,直接给字段设置业务合理的默认值,Hive读取旧数据拿不到该字段时会自动填充默认值,不会返回null:
对应构造函数里也不需要把这个字段设为必填参数,旧数据反序列化时会直接使用默认值,新创建的实例正常传参覆盖默认值就行。@HiveField(2) int idWrkTime = 0; // 替换成你业务需要的默认值即可 - 开发阶段不需要保留旧数据的话直接清缓存
如果是本地调试阶段,存的都是测试数据不需要留存,直接在打开对应Hive Box之前清空旧数据即可:
清空后重新启动应用,新写入的所有数据都会携带// 替换成你实际存储EmployeeModel的Box名称 await Hive.deleteBoxFromDisk('emp_box');idWrkTime字段,不会再出现空值问题。 - 生产环境迭代注意事项
正式上线的版本做模型字段迭代时,不要修改、复用已经使用过的HiveField编号,新增字段统一使用从未用过的顺延编号,同时所有新增字段必须配置默认值,保证旧版本升级的用户读取本地历史数据不会触发类型错误。
注意:不要为了图省事直接把字段声明成可空类型
int?,后续业务逻辑里到处判空会增加不必要的代码量,用默认值是Hive字段迭代最稳妥的兼容方案。
内容的提问来源于stack exchange,提问作者Faris Elkatry
相关产品推荐
相关产品推荐

