Flutter Hive嵌套存储对象时报This object is not in a box错误如何解决
错误根本原因
你遇到的报错核心原因是:只有直接存入Box的HiveObject子类实例才拥有box绑定关系,你作为嵌套字段存储的SecondObject虽然继承了HiveObject,但本身没有被单独存入任何Box,直接调用它的save()方法时Hive找不到对应的存储位置,就会抛出该错误。
最优解决方案(按业务场景选择)
场景1:不需要单独存储/操作SecondObject(推荐,改动最小)
如果你的业务里SecondObject只会作为FirstObject的附属字段存在,不需要单独查询、修改,直接移除SecondObject的HiveObject继承即可,嵌套的Hive可序列化类型不需要继承HiveObject。
修改后的SecondObject定义:
@HiveType(typeId: 1) class SecondObject { @HiveField(0) late String something; @HiveField(1) bool boolean = false; @HiveField(2) late DateTime? date; }
点击复选框的保存逻辑改为修改字段后调用所属FirstObject实例的save()方法即可:
// 假设currentFirst是从Box中取出的FirstObject实例 void onCheckboxChanged(bool value, int index) { currentFirst.secondObject[index].boolean = value; currentFirst.save(); // 可选:更新UI状态 }
场景2:需要单独操作SecondObject实例
如果你的业务需要单独查询、修改SecondObject,使用Hive官方提供的HiveList处理关联关系即可,之前单独建Box出错是没有正确配置关联绑定:
- 先初始化
SecondObject对应的Box:
await Hive.openBox<SecondObject>('second_box');
- 修改
FirstObject的列表字段为HiveList类型:
@HiveType(typeId: 0) class FirstObject extends HiveObject { @HiveField(0) late String string; @HiveField(1) late DateTime dateTime; @HiveField(2) late HiveList<SecondObject> secondObject; }
- 初始化
FirstObject时绑定SecondObject的Box:
final secondBox = Hive.box<SecondObject>('second_box'); final firstObj = FirstObject() ..string = "test" ..dateTime = DateTime.now() ..secondObject = HiveList(secondBox); // 添加SecondObject实例时要先存入secondBox final secondObj = SecondObject()..something = "test"; await secondBox.add(secondObj); firstObj.secondObject.add(secondObj); // 保存FirstObject await Hive.box<FirstObject>('first_box').add(firstObj);
这时候修改SecondObject的字段后直接调用它的save()方法就不会报错了。
内容的提问来源于stack exchange,提问作者Youssef Emad
相关产品推荐
相关产品推荐

