微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hive/Flutter 错误:在 null 上调用了“registerAdapter”

如何解决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 举报,一经查实,本站将立刻删除。