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 类注册两个适配器?

如何在 Hive Flutter 中获取索引的值?

在 UITableViewCell 上调暗 tintColor

在处理程序上调用时为空文本视图

又双叒叕上调派送费,这次“四通一达”们能坚持多久?

html/javascript onsubmit 事件未在表单提交上调用以验证表单