用于 hive flutter 中偏移的类型适配器

问题描述 投票:0回答:1

我有一个名为 DrawLine 的类,并且我已经生成了适配器类

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

part 'draw_line.g.dart';

@HiveType(typeId: 0)
class DrawnLine extends HiveObject{
  @HiveField(0)
  final List<Offset> path;

  @HiveField(1)
  final Color color;

  @HiveField(2)
  final double width;

  @HiveField(3)
  final bool isEraser;
  DrawnLine(this.path, this.color, this.width, this.isEraser);
}

当我尝试保存

DrawLine
对象列表时,出现错误,指示 hive 无法识别对象中的
Offset
类型。

这意味着我也必须为

Offset
制作一个适配器,但我不知道该怎么做。 任何帮助将不胜感激。

flutter hive adapter
1个回答
0
投票

Hive 不支持 Offset。 Hive 仅支持 ListMapDateTimeUint8List

要支持其他对象,您必须注册一个 TypeAdapter,它将对象从二进制形式转换为二进制形式。

在您的情况下,要支持 Offset,您必须创建自己的适配器并在 main 方法中注册它。

void main() async {
  await Hive.initFlutter();
  Hive.registerAdapter(OffsetAdapter());
  await Hive.openBox<Offset>('offsetBox');
}

检查偏移适配器代码:

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';

class OffsetAdapter extends TypeAdapter<Offset> {
  @override
  final typeId = 0;

  @override
  Offset read(BinaryReader reader) {
    final value = reader.readMap();
    final dx = value['dx'] as double;
    final dy = value['dy'] as double;

    return Offset(dx, dy);
  }

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

打开 offsetBox:

final box = Hive.box<Offset>('offsetBox');
© www.soinside.com 2019 - 2024. All rights reserved.