'Hive Error unknown type TimeStamp . did you forget to register an adapter. How to generate TypeAdapter for object type used in external Packages?
My flutter App uses Hive for local data Managing and Firebase for Cloud Data Storage.
I have a modal which uses Timestamp and FieldValue from Firebase package. I have also created the TypeAdapter and registered it for my custom modal in main Class.
When executing the app Hive throws the below error:
unhandled exception: hive error: cannot write, unknown type: Timestamp. did you forget to register an adapter?
Question:
How do I create a TypeAdapter for built in object types such as Timestamp and FieldValue of Firebase package(present in class: loud_firestore.dart) ?
Package:
dependencies:
hive: ^1.4.4
dev_dependencies:
hive_generator: ^0.7.1
build_runner:
Sample Code:
Main Class:
Hive.registerAdapter(SampleModalAdapter());
Modal Code:
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,
});
}
Generated TypeAdapter Code:
// 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;
}
Solution 1:[1]
Based on hive docs, 'hive only supported primitives, lists and maps but also any Dart object you like'. So in your case try to change the saving way to hive like convert it to int miliseconds first.
Solution 2:[2]
For anyone coming back here, write this within a file with '.g.dart' extension:
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);
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | WakeyHazey |
