如何解决Hive/Flutter 错误:在 null 上调用了“registerAdapter”
我是在 Flutter 中使用 Hive 的新手。我已经创建了一个 Hive 模型类以及一个生成的 TypeAdapter,但是当我调用 registeradapter 时,我收到一个错误消息,指出“未处理的异常:NoSuchMethodError:在 null 上调用了方法“registeradapter”。
这是 User.dart:
import 'package:hive/hive.dart';
part 'User.g.dart';
@HiveType(typeId: 1)
class User extends HiveObject {
@HiveField(0)
String username;
@HiveField(1)
double initialWeight;
@HiveField(2)
double heightInches;
@HiveField(3)
DateTime initialDate;
User(
{this.username,this.initialWeight,this.heightInches,this.initialDate});
}
用户.g.dart:
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'User.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class UserAdapter extends TypeAdapter<User> {
@override
final int typeId = 1;
@override
User read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int,dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),};
return User(
username: fields[0] as String,initialWeight: fields[1] as double,heightInches: fields[2] as double,initialDate: fields[3] as DateTime,);
}
@override
void write(BinaryWriter writer,User obj) {
writer
..writeByte(4)
..writeByte(0)
..write(obj.username)
..writeByte(1)
..write(obj.initialWeight)
..writeByte(2)
..write(obj.heightInches)
..writeByte(3)
..write(obj.initialDate);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this,other) ||
other is UserAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
main.dart:
import 'package:Flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_Flutter/hive_Flutter.dart';
import 'constants.dart';
import 'controllers/navigation_controller.dart';
import 'models/User.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter()
..registeradapter(UserAdapter())
..openBox('user');
runApp(MyApp());
}
...
这里是 dev_dependencies: hive_generator:^1.1.0 build_runner: ^2.0.4
解决方法
我发现错误消失了。不确定是不是这样,但这次我使用了 33 的 typeAdapter Id,因为在 https://pub.dev/packages/hive/versions/0.1.1#register-adapter 中找到了这段:
当您希望 Hive 使用您的 TypeAdapter 时,您必须注册它。为此需要两件事:适配器的实例和 typeId。每种类型都有一个唯一的 typeId,用于在从磁盘带回值时找到正确的适配器。 typeIds 0-32 是为原始类型和内置类型保留的。
此外,主要方法现在看起来像这样:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
Hive.registerAdapter(UserAdapter());
await Hive.openBox('user');
runApp(MyApp());
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。