配置单元错误未知类型TimeStamp.你忘了注册适配器了吗.如何为外部包中使用的对象类型生成TypeAdapter



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

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

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

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

问题:

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

包装:

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

基于hive文档,"hive仅支持基元、列表和映射,还支持任何您喜欢的Dart对象"。因此,在您的情况下,请尝试将保存方式更改为类似蜂窝的方式,首先将其转换为毫秒。

对于任何回到这里的人,请在扩展名为'.g.dart'的文件中写下这篇文章:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:hive/hive.dart';
class TimestampAdapter extends TypeAdapter<Timestamp> {
@override
final typeId = 16;
@override
Timestamp read(BinaryReader reader) {
final micros = reader.readInt();
return Timestamp.fromMicrosecondsSinceEpoch(micros);
}
@override
void write(BinaryWriter writer, Timestamp obj) {
writer.writeInt(obj.microsecondsSinceEpoch);
}
}

最新更新