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
相关产品推荐
相关产品推荐

