Hive 错误未知类型 TimeStamp 。您是否忘记注册适配器?如何为外部包中使用的对象类型生成TypeAdapter?

Sri*_*ath 2 dart flutter flutter-hive

我的 flutter 应用程序使用 Hive 进行本地数据管理,使用 Firebase 进行云数据存储。

我有一个使用 Firebase 包中的 Timestamp 和 FieldValue 的模式。我还创建了 TypeAdapter 并在主类中为我的自定义模式注册了它。

执行应用程序 Hive 时抛出以下错误:

未处理的异常:配置单元错误:无法写入,未知类型:时间戳。您是否忘记注册适配器?

问题:

如何为内置对象类型(例如Firebase 包中的Timestamp和FieldValue)创建 TypeAdapter (存在于类中loud_firestore.dart:)?

包裹:

dependencies:

  hive: ^1.4.4

dev_dependencies:

  hive_generator: ^0.7.1

  build_runner: 
Run Code Online (Sandbox Code Playgroud)

示例代码:

主要类别:

Hive.registerAdapter(SampleModalAdapter());
Run Code Online (Sandbox Code Playgroud)

模态代码:

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

part 'samplemodal.g.dart';

@HiveType(typeId: 1)
class SampleModal {
  @HiveField(0)
  String id;
  @HiveField(1)
  String title;
  @HiveField(2)
  Timestamp dateTime;
  @HiveField(3)
  FieldValue serverDateTime;
  SampleModal({
    this.id,
    this.title,
    this.dateTime,
    this.serverDateTime,
  });
}
Run Code Online (Sandbox Code Playgroud)

生成的 TypeAdapter 代码:

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'samplemodal.dart';

// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************

class SampleModalAdapter extends TypeAdapter<SampleModal> {
  @override
  final int typeId = 1;

  @override
  SampleModal read(BinaryReader reader) {
    final numOfFields = reader.readByte();
    final fields = <int, dynamic>{
      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
    };
    return SampleModal(
      id: fields[0] as String,
      title: fields[1] as String,
      dateTime: fields[2] as Timestamp,
      serverDateTime: fields[3] as FieldValue,
    );
  }

  @override
  void write(BinaryWriter writer, SampleModal obj) {
    writer
      ..writeByte(4)
      ..writeByte(0)
      ..write(obj.id)
      ..writeByte(1)
      ..write(obj.title)
      ..writeByte(2)
      ..write(obj.dateTime)
      ..writeByte(3)
      ..write(obj.serverDateTime);
  }

  @override
  int get hashCode => typeId.hashCode;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is SampleModalAdapter &&
          runtimeType == other.runtimeType &&
          typeId == other.typeId;
}
Run Code Online (Sandbox Code Playgroud)

Man*_*tap 5

根据 hive 文档,“hive 仅支持原语、列表和映射,但也支持您喜欢的任何 Dart 对象”。因此,在您的情况下,请尝试更改 hive 的保存方式,例如首先将其转换为 int 毫秒。