Flutter Hive Box添加ListNote报错:未注册对应类型适配器
解决Hive存储自定义ListNote类型报错的方案
1. 检查ListNote模型的Hive注解与适配器生成
确保ListNote类正确配置Hive注解,并且生成了对应的适配器:
正确的ListNote模型示例
import 'package:hive/hive.dart'; part 'list_note.g.dart'; @HiveType(typeId: 1) // typeId需唯一,不可与其他Hive模型重复 class ListNote { @HiveField(0) final String title; @HiveField(1) final String content; @HiveField(2) final DateTime createTime; ListNote({ required this.title, required this.content, required this.createTime, }); }
生成适配器命令
在终端运行以下命令生成适配器代码:
flutter packages pub run build_runner build
确认生成了list_note.g.dart文件,且无编译错误。
2. 注册Hive适配器
在应用初始化阶段(如main()函数),必须在打开Box前注册所有自定义类型的适配器:
import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'path/to/list_note.dart'; import 'path/to/patient.dart'; // 你的患者模型文件 void main() async { await Hive.initFlutter(); // 注册适配器,需在打开Box之前执行 Hive.registerAdapter(ListNoteAdapter()); Hive.registerAdapter(PatientAdapter()); // 患者模型的适配器也必须注册 await Hive.openBox<Patient>('patients'); runApp(MyApp()); }
3. 检查患者模型中ListNote字段的注解
确保患者模型中存储List<ListNote>的字段正确使用@HiveField注解:
import 'package:hive/hive.dart'; import 'list_note.dart'; part 'patient.g.dart'; @HiveType(typeId: 0) // typeId保持唯一即可 class Patient { @HiveField(0) final String id; @HiveField(1) final String name; @HiveField(2) final List<ListNote> notes; // 存储ListNote列表的字段 Patient({ required this.id, required this.name, required this.notes, }); }
4. 添加笔记的正确实现逻辑
修改目标患者并添加新笔记时,需避免直接修改Box中的原对象,应先取出对象、修改后再放回:
void addNoteToPatient(String patientId, ListNote newNote) async { final patientBox = Hive.box<Patient>('patients'); final targetPatient = patientBox.get(patientId); if (targetPatient != null) { // 复制原笔记列表并添加新笔记,确保Hive能检测到对象变更 final updatedNotes = List<ListNote>.from(targetPatient.notes)..add(newNote); final updatedPatient = Patient( id: targetPatient.id, name: targetPatient.name, notes: updatedNotes, ); await patientBox.put(patientId, updatedPatient); } }
常见排查点
- 所有自定义模型的
typeId必须唯一,不可重复 - 若修改过模型字段,需重新生成适配器(可使用
flutter packages pub run build_runner watch实时生成) - 必须在打开Box之前完成所有适配器的注册,顺序错误也会触发报错
内容的提问来源于stack exchange,提问作者Buubulle
相关产品推荐
相关产品推荐

