'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