7

I'm currently implementing Hive in my FlutterApp. Unfortunately this error pops up all the time:

HiveError: There is already a TypeAdapter for typeId 100.

This is my object:

@HiveType(typeId: 100)
class ShopList{
  @HiveField(0)
  String name;
  @HiveField(1)
  List<ListProduct> products = List();

  ShopList({this.name, this.products});

That's the AUTO-GENERATED adapter:

class ShopListAdapter extends TypeAdapter<ShopList> {
  @override
  final int typeId = 100;

  @override
  ShopList read(BinaryReader reader) {
    final numOfFields = reader.readByte();
    final fields = <int, dynamic>{
      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
    };
    return ShopList(
      name: fields[0] as String,
      products: (fields[1] as List)?.cast<ListProduct>(),
    );
  }

  @override
  void write(BinaryWriter writer, ShopList obj) {
    writer
      ..writeByte(2)
      ..writeByte(0)
      ..write(obj.name)
      ..writeByte(1)
      ..write(obj.products);
  }

  @override
  int get hashCode => typeId.hashCode;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is ShopListAdapter &&
          runtimeType == other.runtimeType &&
          typeId == other.typeId;
}

I have some other Objects with the typeIds 101 and 102, which throw the same error. The Hive.registerAdapter(ShopListAdapter)); runs in a try-catch-block. So if the adapter were already loaded, the code can just go on, BUT the FutureBuilder-Widget using the value from the Hive loads infinitely long. Do you have any tips?

padaleiana
  • 955
  • 1
  • 14
  • 23
benicamera
  • 750
  • 1
  • 7
  • 24

4 Answers4

13

I was using an UserAdapter type id=0 so you should check before calling the Hive.registerAdapter as i showed you the below code

enter image description here

 if (!Hive.isAdapterRegistered(0)) {
      Hive.registerAdapter(UserAdapter());
    }
2

you need to check typeId, they should be different and unique from other class models even in same file.

@HiveType(typeId: 0)
class Module1 {}

@HiveType(typeId: 1)
class Module2 {}

Once typeId has been changed then

reinstall the app,
delete .g.dart generated file,
run command ---> flutter packages pub run build_runner build
Mrudul Addipalli
  • 574
  • 6
  • 10
0

If you are sure you have registered the adapter, then that must be cache issue, run flutter clean and MOST IMPORTANTLY Unstill the app and run it afresh. The problem will be so

MUHINDO
  • 788
  • 6
  • 10
-1

Friend, I used the command Hive.resetAdapters() , it worked for me.enter image description here

  • WARNING: This method is only intended to be used for integration and unit tests and SHOULD not be used in production code. – Afinas EM Apr 13 '23 at 07:42