Hive/Flutter 错误:在 null 上调用了“registerAdapter”
Posted
技术标签:
【中文标题】Hive/Flutter 错误:在 null 上调用了“registerAdapter”【英文标题】:Hive/Flutter error: 'registerAdapter' was called on null 【发布时间】:2021-09-07 10:43:23 【问题描述】:我是在 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
有什么办法可以解决这个错误?谢谢!
【问题讨论】:
【参考方案1】:我得到的错误消失了。不确定是不是这样,但这次我使用了 33 的 typeAdapter Id,因为在 https://pub.dev/packages/hive/versions/0.1.1#register-adapter 找到了这段代码:
当您希望 Hive 使用您的 TypeAdapter 时,您必须注册它。为此需要两件事:适配器的实例和 typeId。每个类型都有一个唯一的 typeId,用于在从磁盘取回值时找到正确的适配器。 typeIds 0-32 保留给原始类型和内置类型。
另外,main 方法现在看起来像这样:
void main() async
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
Hive.registerAdapter(UserAdapter());
await Hive.openBox('user');
runApp(MyApp());
【讨论】:
以上是关于Hive/Flutter 错误:在 null 上调用了“registerAdapter”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 HIVE、Flutter 为两个不同的 Modal 类注册两个适配器?