benicamera
benicamera

Reputation: 804

HiveError: There is already a TypeAdapter

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?

Upvotes: 8

Views: 5816

Answers (5)

weird.ly
weird.ly

Reputation: 185

To resolve this issue, you need to ensure that each Hive class has a unique typeId value. The @HiveType(typeId: 0) annotation is used to specify a unique type identifier for a class in Hive. If you have multiple classes, make sure that the typeId values are distinct for each class. For example, you can use @HiveType(typeId: 1) for one class, @HiveType(typeId: 2) for another, and so on.

Upvotes: 0

MUHINDO
MUHINDO

Reputation: 1213

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

Upvotes: 0

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

Upvotes: -1

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());
    }

Upvotes: 15

Mrudul Addipalli
Mrudul Addipalli

Reputation: 624

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

Upvotes: 6

Related Questions