如何使用 HIVE、Flutter 为两个不同的 Modal 类注册两个适配器?

问题描述

我的 main.dart 文件注册 todosAdapter()

时出错
  WidgetsFlutterBinding.ensureInitialized();

  final appDocumentDirectory =
      await path_provider.getApplicationDocumentsDirectory();
  await Hive.initFlutter();
  
  Hive.registeradapter(notesAdapter());
  Hive.registeradapter(todosAdapter());
 

  await Hive.openBox("notes");
  //await Hive.openBox("todo");

  runApp(ChangeNotifierProvider(
    create: (context) => Note_tile(),child: MaterialApp(
      debugShowCheckedModeBanner: false,home: MyHomePage(),theme: ThemeData(brightness: Brightness.dark),),));
}

我在注册 todosAdapter

时出错

未定义函数“todosAdapter”。 尝试导入定义“todosAdapter”的库,将名称更正为现有函数名称,或定义名为“todosAdapter”的函数

我的第一个 Modal 类是笔记


part 'note.g.dart';

var date = new DateTime.Now().toString();

var dateParse = DateTime.parse(date);

var formattedDate = "${dateParse.day}-${dateParse.month}-${dateParse.year}";

@HiveType(typeId: 0)
class notes {
  @HiveField(0)
  late String title;
  @HiveField(1)
  late String description;
  @HiveField(2)
  late String date = formattedDate;
  notes({required this.title,required this.description});
}

note modal 类的 .g.dart 文件

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'note.dart';

// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************

class notesAdapter extends TypeAdapter<notes> {
  @override
  final int typeId = 0;

  @override
  notes read(BinaryReader reader) {
    final numOfFields = reader.readByte();
    final fields = <int,dynamic>{
      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),};
    return notes(
      title: fields[0] as String,description: fields[1] as String,)..date = fields[2] as String;
  }

  @override
  void write(BinaryWriter writer,notes obj) {
    writer
      ..writeByte(3)
      ..writeByte(0)
      ..write(obj.title)
      ..writeByte(1)
      ..write(obj.description)
      ..writeByte(2)
      ..write(obj.date);
  }

  @override
  int get hashCode => typeId.hashCode;

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

我的第二个 Modal 类是待办事项

import 'package:hive/hive.dart';

part 'todo.g.dart';

var date = new DateTime.Now().toString();

var dateParse = DateTime.parse(date);

var formattedDate = "${dateParse.day}-${dateParse.month}-${dateParse.year}";

@HiveType(typeId: 0)
class todos {
  @HiveField(0)
  late String title;
  @HiveField(1)
  late String description;
  @HiveField(2)
  late String date = formattedDate;
  @HiveField(3)
  late bool status = false;
  todos({required this.title,required this.description});
}

tod​​os 类的 .g.dart 文件

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'todo.dart';

// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************

class todosAdapter extends TypeAdapter<todos> {
  @override
  final int typeId = 0;

  @override
  todos read(BinaryReader reader) {
    final numOfFields = reader.readByte();
    final fields = <int,};
    return todos(
      title: fields[0] as String,)
      ..date = fields[2] as String
      ..status = fields[3] as bool;
  }

  @override
  void write(BinaryWriter writer,todos obj) {
    writer
      ..writeByte(4)
      ..writeByte(0)
      ..write(obj.title)
      ..writeByte(1)
      ..write(obj.description)
      ..writeByte(2)
      ..write(obj.date)
      ..writeByte(3)
      ..write(obj.status);
  }

  @override
  int get hashCode => typeId.hashCode;

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

解决方法

TodosNotes 不应具有相同的 typeId。尝试更改其中之一。