访问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的关联规范,导致读取时触发错误。
解决步骤
确保Empresa类正确注册为Hive类型
检查Empresa类是否添加了@HiveType注解并生成了适配器文件,在应用初始化时注册适配器:Hive.registerAdapter(EmpresaAdapter());将普通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'));提前打开所有依赖的Box
在应用启动阶段,先打开empresasBox,再打开empresariosBox,确保依赖顺序正确: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()); }更新操作逻辑
后续操作Empresario的empresas列表时,直接使用HiveList的API,比如添加元素:empresario.empresas?.add(empresaInstance); empresario.save(); // 保存Empresario对象
内容的提问来源于stack exchange,提问作者Dox
相关产品推荐
相关产品推荐

