본문 바로가기
개발/Flutter

flutter hive unknown type error

by dev_caleb 2022. 11. 25.
728x90

write 하는데 오류가 나서 좀 찾아봤다. 

나중에 업데이트 할 때 참고해서 오류 수정해야겠다 

https://github.com/hivedb/hive/issues/421

 

hive error: cannot write, unknown type: Timestamp. How to generate TypeAdapter for object type used in external Packages? · Is

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 a...

github.com

 

 

 

Doc을 읽어봤더니 이러하다, 우리는 hive를 사용하기 위해서 TypeAdapters를 만들어서 주입시키게 된다.

예를 들어서 UserModel 이라는 Type은 따로 UserModel 에 대한 TypeAdapter가 필요한 것이다. 

그렇지 않으면, create TypeAdapter manually가 있긴 했다. 

그렇다면.. 지금 문제가 되는, TypeAdapter의 Timestamp 부분만 Adapter를 만들어서 주입시켜주면 되지 않을까라는 생각을 해보았다.

 

Hive.registerAdapter(MatjipModelAdapter());

이런 코드를 쓰고 있는데 register를 추가로 해주면 되지 않을까라는 생각을 해본 것이다.

 

 

typeId를 정해넣어야하는데, all adapter에 unique한 number를 지정해줘야한다고 한다. 

matjipAdapter는 number를 확인해보니 0 이어서 이번 adapter는 1로 지정해줬다.

 

 

class TimestampAdapter extends TypeAdapter<Timestamp> {
  @override
  Timestamp read(BinaryReader reader) {
    final micros = reader.readInt();
   return Timestamp.fromMillisecondsSinceEpoch(micros);
  }

  @override
  int get typeId => 1;

  @override
  void write(BinaryWriter writer, Timestamp obj) {
    writer.writeInt(obj.millisecondsSinceEpoch);
  }
}

 

 

///Hive 내부 db를 사용하기 위한 initializing
await Hive.initFlutter();
Hive.registerAdapter(MatjipModelAdapter());
Hive.registerAdapter(TimestampAdapter());
await HiveHelper().openBox();

이렇게 바꿔줬더니

 

E/flutter (11961): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: HiveError: Cannot write, unknown type: GeoPoint. Did you forget to register an adapter?
E/flutter (11961): #0      BinaryWriterImpl.write (package:hive/src/binary/binary_writer_impl.dart:338:9)
E/flutter (11961): #1      MatjipModelAdapter.write (package:matjipmemo/models/firebase/matjip_model.g.dart:124:9)
E/flutter (11961): #2      BinaryWriterImpl.write (package:hive/src/binary/binary_writer_impl.dart:344:24)
E/flutter (11961): #3      BinaryWriterImpl.writeFrame (package:hive/src/binary/binary_writer_impl.dart:282:9)
E/flutter (11961): #4      StorageBackendVm.writeFrames.<anonymous closure> (package:hive/src/backend/vm/storage_backend_vm.dart:128:31)
E/flutter (11961): #5      ReadWriteSync.syncWrite.<anonymous closure> (package:hive/src/backend/vm/read_write_sync.dart:26:41)
E/flutter (11961): <asynchronous suspension>
E/flutter (11961): #6      BoxImpl._writeFrames (package:hive/src/box/box_impl.dart:88:7)
E/flutter (11961): <asynchronous suspension>
E/flutter (11961): #7      BoxBaseImpl.add (package:hive/src/box/box_base_impl.dart:112:5)
E/flutter (11961): <asynchronous suspension>

 

와.. 오류문구가 바뀌었다.. Timestamp는 이제 했으니 GeoPoint를 만들라는 얘기다.

 

자 이제 GeoPoint를 만들어보자

..

 

 

 

class DocRefAdapter extends TypeAdapter<DocumentReference> {
  @override
  DocumentReference<Object?> read(BinaryReader reader) {
    final String micros = reader.readString();
    return FirebaseFirestore.instance.doc(micros);
  }

  @override
  int get typeId => 4;

  @override
  void write(BinaryWriter writer, DocumentReference<Object?> obj) {
    writer.writeString(obj.path);
  }
}
class GeoPointAdapter extends TypeAdapter<GeoPoint> {
  @override
  GeoPoint read(BinaryReader reader) {
    final Map micros = reader.readMap();
    return GeoPoint(micros['lat'] ?? 0, micros['lng'] ?? 0);
  }

  @override
  int get typeId => 2;

  @override
  void write(BinaryWriter writer, GeoPoint obj) {
    writer.writeMap({'lat': obj.latitude, 'lng': obj.longitude});
  }
}

이렇게 하고나니 이제 오류가 뜨지 않는다..

 

오늘도 수고했다!

728x90

'개발 > Flutter' 카테고리의 다른 글

flutter how to know recent version  (0) 2022.11.26
Flutter hive 원하는 model 넣기  (0) 2022.11.25
flutter library fork from GitHub  (0) 2022.11.22
flutter library 업데이트 -> PR 적용하기  (0) 2022.11.22
flutter super initializer  (0) 2022.11.22