write 하는데 오류가 나서 좀 찾아봤다.
나중에 업데이트 할 때 참고해서 오류 수정해야겠다
https://github.com/hivedb/hive/issues/421
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});
}
}
이렇게 하고나니 이제 오류가 뜨지 않는다..
오늘도 수고했다!
'개발 > 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 |