Flutter Hive访问嵌套HiveList字段提示HiveObjectMixin无对应getter怎么办
问题原因及解决方法
你的报错核心是Dart无法推断HiveList内存储的元素类型,同时UserAdapter的字段索引匹配存在错误,按以下步骤修改即可:
1. 为HiveList指定泛型类型
未指定泛型的HiveList默认元素类型为HiveObjectMixin,自然不存在cost字段。修改User类中的transactions字段定义:
@HiveType(typeId: 1) class User extends HiveObject { @HiveField(0) late String nameFamily; @HiveField(1) late String apiToken; @HiveField(2) late String mobileNumber; // 新增泛型指定为Transactions @HiveField(3) late HiveList<Transactions> transactions; }
2. 修复UserAdapter的字段索引错误
你的User类仅定义了4个Hive字段(索引0~3),但适配器中存在两处错误:
- write方法中写入了错误的字段数量
6,实际应为4 - read方法中错误读取索引
5的字段赋值给transactions,对应正确索引为3
修改后的UserAdapter代码:
class UserAdapter extends TypeAdapter<User> { @override final int typeId = 1; @override User read(BinaryReader reader) { final numOfFields = reader.readByte(); final fields = <int, dynamic>{ for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return User() ..nameFamily = fields[0] as String ..apiToken = fields[1] as String ..mobileNumber = fields[2] as String // 修正索引为3,同时指定cast的泛型 ..transactions = (fields[3] as HiveList).castHiveList<Transactions>(); } @override void write(BinaryWriter writer, User obj) { writer // 修正字段数量为4 ..writeByte(4) ..writeByte(0) ..write(obj.nameFamily) ..writeByte(1) ..write(obj.apiToken) ..writeByte(2) ..write(obj.mobileNumber) ..writeByte(3) ..write(obj.transactions); } @override int get hashCode => typeId.hashCode; @override bool operator ==(Object other) => identical(this, other) || other is UserAdapter && runtimeType == other.runtimeType && typeId == other.typeId; }
3. 确认前置配置
- 确保
Transactions对应的适配器已经在Hive初始化阶段完成注册 - 如果你使用自动生成适配器的方案,修改模型后重新执行命令生成新的适配代码:
flutter packages pub run build_runner build - 本地已存在的旧格式数据需要清理,避免结构不兼容导致新的报错
完成修改后再运行原代码即可正常读取cost字段。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

