Flutter Hive模型含枚举字段无法存入/设置值的解决方案咨询
Hive中存储枚举字段的解决方案
Hive 默认不支持直接序列化枚举类型,需要通过自定义类型适配器实现枚举的存储与读取,以下是完整解决步骤:
1. 定义自定义枚举 CONTACTTYPE
先明确枚举结构:
enum CONTACTTYPE { loop, friend, family, // 可添加其他枚举值 }
2. 创建枚举的Hive类型适配器
编写继承自 TypeAdapter 的适配器类,将枚举与可序列化类型(如int索引、字符串名称)互相转换:
import 'package:hive/hive.dart'; class CONTACTTYPEAdapter extends TypeAdapter<CONTACTTYPE> { // 设置唯一typeId,注意不要与其他Hive模型/适配器的typeId重复 @override final int typeId = 1; @override CONTACTTYPE read(BinaryReader reader) { // 通过索引读取并转换为枚举 return CONTACTTYPE.values[reader.readInt()]; } @override void write(BinaryWriter writer, CONTACTTYPE obj) { // 将枚举转换为索引写入 writer.writeInt(obj.index); } }
若担心后续枚举新增值导致索引错乱,可改用枚举名称存储:
@override CONTACTTYPE read(BinaryReader reader) { return CONTACTTYPE.values.firstWhere((e) => e.name == reader.readString()); } @override void write(BinaryWriter writer, CONTACTTYPE obj) { writer.writeString(obj.name); }
3. 注册类型适配器
在Hive初始化时注册适配器,确保Hive能识别枚举类型:
import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; void main() async { await Hive.initFlutter(); // 注册枚举适配器 Hive.registerAdapter(CONTACTTYPEAdapter()); // 打开对应的Box await Hive.openBox<FriendsGroupEntity>('friends_groups'); runApp(MyApp()); }
4. 调整FriendsGroupEntity类
确保枚举字段正确标记@HiveField并设置默认值,同时构造函数同步默认值保证一致性:
import 'package:hive/hive.dart'; part 'friends_group_entity.g.dart'; @HiveType(typeId: 0) // 此typeId需与适配器的typeId不同 class FriendsGroupEntity extends HiveObject { @HiveField(0) String groupName; // 设置默认值为CONTACTTYPE.loop @HiveField(1, defaultValue: CONTACTTYPE.loop) CONTACTTYPE contactType; FriendsGroupEntity({ required this.groupName, // 构造函数中也设置默认值 this.contactType = CONTACTTYPE.loop, }); }
最后一步:生成Hive代码
运行以下命令生成Hive所需的适配器代码:
flutter packages pub run build_runner build
内容的提问来源于stack exchange,提问作者Rahul Variya
相关产品推荐
相关产品推荐

