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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:40:39