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

Flutter中Hive无法识别Offset类型,求创建对应适配器方法

解决Hive无法识别Offset/Color类型的问题

Hive本身不支持dart:ui中的Offset和Color这类内置类型,所以需要为它们自定义适配器来实现序列化/反序列化,下面是具体步骤:

1. 创建Offset适配器

新建一个offset_adapter.dart文件,实现TypeAdapter<Offset>:

import 'dart:ui';
import 'package:hive/hive.dart';

class OffsetAdapter extends TypeAdapter<Offset> {
  @override
  final typeId = 1; // 注意这个ID要和其他适配器不重复,比如你的DrawnLine用了0,这里用1

  @override
  Offset read(BinaryReader reader) {
    final dx = reader.readDouble();
    final dy = reader.readDouble();
    return Offset(dx, dy);
  }

  @override
  void write(BinaryWriter writer, Offset obj) {
    writer.writeDouble(obj.dx);
    writer.writeDouble(obj.dy);
  }
}

2. 创建Color适配器

同样新建color_adapter.dart,处理Color类型:

import 'dart:ui';
import 'package:hive/hive.dart';

class ColorAdapter extends TypeAdapter<Color> {
  @override
  final typeId = 2; // 确保ID唯一

  @override
  Color read(BinaryReader reader) {
    final value = reader.readInt();
    return Color(value);
  }

  @override
  void write(BinaryWriter writer, Color obj) {
    writer.writeInt(obj.value);
  }
}

3. 注册适配器

在你的Hive初始化代码中,注册这两个适配器(比如在main.dart里):

import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'offset_adapter.dart';
import 'color_adapter.dart';
import 'draw_line.dart';

void main() async {
  await Hive.initFlutter();
  // 注册自定义适配器
  Hive.registerAdapter(OffsetAdapter());
  Hive.registerAdapter(ColorAdapter());
  Hive.registerAdapter(DrawnLineAdapter()); // 你的DrawnLine适配器
  // 打开对应的box
  await Hive.openBox<DrawnLine>('drawn_lines');
  runApp(MyApp());
}

4. 重新生成DrawnLine的适配器

因为你的DrawnLine类依赖了Offset和Color,现在需要重新运行生成命令来更新适配器:

flutter packages pub run build_runner build

做完这些步骤后,Hive就能正确序列化和反序列化包含Offset和Color的DrawnLine对象了。

内容的提问来源于stack exchange,提问作者Kumah Andrews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:47:27