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

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出错是没有正确配置关联绑定:

  1. 先初始化SecondObject对应的Box:
await Hive.openBox<SecondObject>('second_box');
  1. 修改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;
}
  1. 初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:36:04