2

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

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

执行应用程序 Hive 时会引发以下错误:

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

问题:

如何为 Firebase 包的TimestampFieldValueloud_firestore.dart等内置对象类型创建 TypeAdapter(存在于类中:) ?

包裹:

dependencies:

  hive: ^1.4.4

dev_dependencies:

  hive_generator: ^0.7.1

  build_runner: 

示例代码:

主类:

Hive.registerAdapter(SampleModalAdapter());

模式代码:

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,
  });
}

生成的 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;
}
4

1 回答 1

5

基于 hive 文档,“hive 仅支持原语、列表和地图,还支持您喜欢的任何 Dart 对象”。因此,在您的情况下,请尝试将保存方式更改为配置单元,例如先将其转换为 int 毫秒。

于 2020-09-09T10:51:40.947 回答