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