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

访问Hive中Empresario Box时抛出HiveError异常求助

问题:Hive存储含列表对象时打开Box失败

我通过创建新的Empresario对象或查找现有对象启动应用,以此访问配置文件。当Empresario对象中的Empresa列表为空时,应用运行正常;但添加Empresa对象后,每次访问Empresario Box都会抛出错误:

HiveError (HiveError: To use this list, you have to open the box "empresas" first.)

尝试手动打开empresas Box也执行失败。

Empresario类结构

import 'package:hive/hive.dart';
import 'package:apiary/objetos/empresa.dart';

part 'empresario.g.dart';

@HiveType(typeId: 0)
class Empresario extends HiveObject {
  @HiveField(0)
  final String id;

  @HiveField(1)
  final String? nombre;

  @HiveField(2)
  final String correo;

  @HiveField(3)
  final String password;

  @HiveField(4)
  final String? telefono;

  @HiveField(5)
  final String? foto;

  @HiveField(6)
  List<Empresa>? empresas;

  Empresario({
    this.id = '',
    this.nombre,
    required this.correo,
    required this.password,
    this.telefono,
    this.foto,
    this.empresas,
  });
}

卡住的核心方法

应用在以下两个方法中停止执行,均卡在打开Empresario Box的代码行:

Future<void> saveEmpresario(Empresario empresario) async {
  final Box<Empresario> empresarios =
      await Hive.openBox<Empresario>('empresarios');
  empresarios.add(empresario);
}

Future<Empresario?> findEmpresarioByCredentials(
    String correo, String password) async {
  final Box<Empresario> empresarios =
      await Hive.openBox<Empresario>('empresarios');

  final empresario = empresarios.values.firstWhereOrNull(
    (empresario) =>
        empresario.correo == correo && empresario.password == password,
  );

  return empresario;
}

问题原因与解决方法

原因分析

Hive不支持直接存储自定义对象的普通List,当你在Empresario中定义List<Empresa>? empresas并标记为@HiveField时,Hive会自动将这个列表关联到名为empresas的Box,但该Box未被提前注册、打开,且列表类型不符合Hive的关联规范,导致读取时触发错误。

解决步骤

  1. 确保Empresa类正确注册为Hive类型
    检查Empresa类是否添加了@HiveType注解并生成了适配器文件,在应用初始化时注册适配器:

    Hive.registerAdapter(EmpresaAdapter());
    
  2. 将普通List替换为HiveList
    修改Empresario类中的empresas字段为HiveList<Empresa>?,HiveList是Hive专门用于关联其他Box列表的类型:

    @HiveField(6)
    HiveList<Empresa>? empresas;
    
    Empresario({
      this.id = '',
      this.nombre,
      required this.correo,
      required this.password,
      this.telefono,
      this.foto,
      HiveList<Empresa>? empresas,
    }) : empresas = empresas ?? HiveList(Hive.box<Empresa>('empresas'));
    
  3. 提前打开所有依赖的Box
    在应用启动阶段,先打开empresas Box,再打开empresarios Box,确保依赖顺序正确:

    void main() async {
      await Hive.initFlutter();
      // 注册所有适配器
      Hive.registerAdapter(EmpresarioAdapter());
      Hive.registerAdapter(EmpresaAdapter());
      // 先打开empresas Box
      await Hive.openBox<Empresa>('empresas');
      // 再打开empresarios Box
      await Hive.openBox<Empresario>('empresarios');
      runApp(MyApp());
    }
    
  4. 更新操作逻辑
    后续操作Empresario的empresas列表时,直接使用HiveList的API,比如添加元素:

    empresario.empresas?.add(empresaInstance);
    empresario.save(); // 保存Empresario对象
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:52:28