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.5
和
build_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。您是不是忘记注册适配器?的主要内容,如果未能解决你的问题,请参考以下文章