Flutter Hive报错:TypeAdapter的typeId 0已被占用
解决Hive报错:There is already a TypeAdapter for typeId 0
问题根源
代码存在typeId不一致的核心冲突:
Product.dart中手动设置了@HiveType(typeId: 1)- 自动生成的
Product.g.dart里,ProductAdapter的typeId却被设为0
这种不一致加上旧缓存未彻底清理,最终触发重复注册报错。
分步解决方案
1. 统一typeId并重新生成适配器
- 打开
Product.dart,确认@HiveType(typeId: 1)(确保该ID未被其他自定义Hive类占用) - 执行代码生成命令,强制同步适配器的typeId:
执行后检查flutter packages pub run build_runner build --delete-conflicting-outputsProduct.g.dart,确认typeId已与Product.dart中的设置一致(应为1)。
2. 避免适配器重复注册
修改main.dart的注册逻辑,添加判断确保只注册一次:
Future<void> main() async { await Hive.initFlutter(); if (!Hive.isAdapterRegistered(1)) { // ID与typeId保持一致 Hive.registerAdapter(ProductAdapter()); } boxProducts = await Hive.openBox<Product>('productsBox'); runApp(const MyApp()); }
3. 彻底清理旧数据与缓存
- 执行
flutter clean清理项目缓存 - 卸载模拟器中的应用并重启模拟器(确保Hive本地存储被完全清除)
- 重新运行项目
额外注意
- 所有自定义Hive类的
typeId必须唯一,不能与内置类型或其他类重复 - 禁止在多个代码位置注册同一个适配器
内容的提问来源于stack exchange,提问作者Mamood2271
相关产品推荐
相关产品推荐

