添加Duration字段后Hive报未知类型错误,重生成适配器仍未解决
解决Hive中Duration类型无法序列化的问题
问题描述
在WorkOutRecordModel中添加Duration字段后,出现以下错误:
Unhandled Exception: HiveError: Cannot write, unknown type: Duration. Did you forget to register an adapter?
已删除并重新生成workout_record.g.dart,且已注册模型适配器,但问题依旧。
模型代码:
import 'package:hive_flutter/hive_flutter.dart'; part 'workout_record.g.dart'; @HiveType(typeId: 3) class WorkOutRecordModel { @HiveField(1) final String icon; @HiveField(2) final String workoutName; @HiveField(3) final DateTime dateTime; @HiveField(5) final Duration duration; WorkOutRecordModel({ required this.dateTime, required this.icon, required this.workoutName, required this.duration, }); }
问题原因
Hive默认不支持Duration类型的序列化/反序列化,自动生成的模型适配器仅能处理Hive内置支持的类型(如String、int、DateTime等),Duration不在此列。
解决方案
1. 自定义Duration的TypeAdapter
创建一个自定义适配器,将Duration转换为Hive支持的int类型(存储毫秒数):
import 'package:hive/hive.dart'; class DurationAdapter extends TypeAdapter<Duration> { @override final int typeId = 100; // 选择一个未被使用的唯一typeId,避免与现有模型冲突 @override Duration read(BinaryReader reader) { // 从存储的毫秒数还原Duration return Duration(milliseconds: reader.readInt()); } @override void write(BinaryWriter writer, Duration obj) { // 将Duration转换为毫秒数存储 writer.writeInt(obj.inMilliseconds); } }
2. 注册自定义适配器
在Hive初始化时,除了注册模型适配器,还要注册这个自定义的DurationAdapter:
import 'package:hive_flutter/hive_flutter.dart'; import 'path/to/duration_adapter.dart'; // 替换为你的适配器文件路径 import 'path/to/workout_record.dart'; void initHive() async { await Hive.initFlutter(); Hive.registerAdapter(WorkOutRecordModelAdapter()); Hive.registerAdapter(DurationAdapter()); // 注册自定义适配器 await Hive.openBox<WorkOutRecordModel>('workout_records'); }
3. 验证模型字段
确保模型中的Duration字段标注正确的@HiveField,现有代码中@HiveField(5)设置无误,无需修改。
注意事项
- 自定义适配器的
typeId必须唯一,不能与现有Hive模型或其他自定义适配器的typeId重复 - 无需重新生成模型的
.g.dart文件,自定义适配器独立于自动生成的适配器工作
内容的提问来源于stack exchange,提问作者unrealt3n
相关产品推荐
相关产品推荐

