HiveError:无法读取,未知 typeId:32。您是不是忘记注册适配器?

Posted

技术标签:

【中文标题】HiveError:无法读取,未知 typeId:32。您是不是忘记注册适配器?【英文标题】:HiveError: Cannot read, unknown typeId: 32. Did you forget to register an adapter?HiveError:无法读取,未知 typeId:32。您是否忘记注册适配器? 【发布时间】:2021-11-14 10:50:32 【问题描述】:

我正在尝试创建一个 try Hive 数据库,但遇到了一些我无法解决的问题。

我的模型是

@HiveType(typeId: 1)
class Tasks 
  @HiveField(0)
  final String task;

  @HiveField(1)
  final bool isCompleted;

  Tasks(required this.task, required this.isCompleted);

以及hive_generator生成的文件

class TasksAdapter extends TypeAdapter<Tasks> 
  @override
  final int typeId = 1;

  @override
  Tasks read(BinaryReader reader) 
    final numOfFields = reader.readByte();
    final fields = <int, dynamic>
      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
    ;
    return Tasks(
      task: fields[0] as String,
      isCompleted: fields[1] as bool,
    );
  

  @override
  void write(BinaryWriter writer, Tasks obj) 
    writer
      ..writeByte(2)
      ..writeByte(0)
      ..write(obj.task)
      ..writeByte(1)
      ..write(obj.isCompleted);
  

    @override
  int get hashCode => typeId.hashCode;

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

在我的main():

Future<void> main() async 
  WidgetsFlutterBinding.ensureInitialized();
  final directory = await getApplicationDocumentsDirectory();
  Hive.init(directory.path);

  Hive.registerAdapter(TasksAdapter());
  await Hive.openBox<Tasks>("TheList");

  runApp(const MyApp());

我也尝试过延迟打开,但调试时显示相同的错误。

我安装的依赖项是: hive: ^2.0.4 hive_flutter: ^1.1.0 path_provider: ^2.0.5build_runner: ^2.1.2 hive_generator: ^1.1.1

【问题讨论】:

【参考方案1】:

出现此错误的原因有很多。首先,我会尝试导入hive_flutter:

import 'package:hive_flutter/hive_flutter.dart';

然后在打开任何盒子之前致电await Hive.initFlutter();

此外,您可以将 registerAdapter 调用包装在 if 语句中:

if (!Hive.isAdapterRegistered(1)) 
    Hive.registerAdapter(TasksAdapter());
  

【讨论】:

【参考方案2】:

解决方案是用 hive_flutter 包中的 Hive.ininFlutter(); 替换 Hive.init();

所以,代码是:

void main() async 
  WidgetsFlutterBinding.ensureInitialized();
  final document = await getApplicationDocumentsDirectory();
  await Hive.initFlutter(document.path);
  Hive.registerAdapter(TodoAdapter());
  await Hive.openBox<Todo>('todos');
  runApp(const MyApp());

【讨论】:

【参考方案3】:

我注意到当我更改 typeId 时也发生了同样的情况。我通过从手机中删除应用程序并再次运行它来修复我的问题,有点像清除缓存。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于HiveError:无法读取,未知 typeId:32。您是不是忘记注册适配器?的主要内容,如果未能解决你的问题,请参考以下文章

ssh:无法解析主机名 git:名称或服务未知 致命:无法从远程存储库读取

无法从/在 SRAM 中加载/存储数据:读取数据未知

EF:使用typeid映射实体框架层次结构

无法在Fortran中读取未知长度字符串的实数

Flutter Hive:处理复杂 json 的多个类

收到此错误:处理命令时发生未知的服务器端错误。原始错误:无法读取未定义的属性“替换”