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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:46:18