如何解决 Hive 中的动态列表类型转换错误?

问题描述

抱歉,我刚开始使用 Flutter 和 Hive 本地存储。

我正在使用

  hive: ^2.0.4
  hive_Flutter: ^1.0.0

我像这样在主函数中打开盒子

Future<void> main() async {

  await Hive.initFlutter();
  await Hive.openBox<List<Event>>("events");

}

从服务器获取数据后,我使用这样的代码将所有事件保存到 hive

final eventsBox = Hive.Box<List<Event>>("events");
final List<Event> eventsFromServer = await getEventsFromServer();
eventsBox.put("recommended_events",eventsFromServer);

但是在尝试从框中读取数据时出错,我是这样读取的

final eventsBox = Hive.Box<List<Event>>("events");

// error in this one line below
final eventsFromHive = eventsBox.get("recommended_events",defaultValue: []) ?? []; 

type 'List ' 不是类型 'List?' 的子类型类型 演员

如何解决这种类型转换错误

here 中的文档说

get() 返回的列表总是 List 类型(Maps of type 地图)。使用 list.cast() 将它们转换为 具体类型。

我不知道这是否是我的问题的解决方案,但我不知道如何在我的代码中实现它。

我是这样试的,但还是出现同样的错误

final eventsFromHive = eventsBox.get("recommended_events")!.cast<Event>();

或者我编写语法来保存和读取列表的方式是完全错误的?请帮忙:)

解决方法

没必要把你的盒子作为List打开,因为它是一个盒子,可以存储你声明的类型的很多对象,例如:

await Hive.openBox<MyModel>(boxName);

要获取存储在该框中的所有对象或数据,您可以这样查询:

final box = Hive.box<CompanyModel>(boxName);
List<CompanyModel> interviews = box.values.toList();

此外,如果您想使用 Hive 存储您自己的模型,您必须创建一个适配器模型

自动生成模型有两个开发依赖项:

dev_dependencies: 
  hive_generator: 
  build_runner: 

导入依赖项并运行此命令 flutter packages pub run build_runner build 将生成模型,但您也必须按照文档说明创建模型。 >

我建议您查看文档。

Hive - Generate Adapter

,

我终于可以像这样使用它来解决它了。在主函数中

Future<void> main() async {

  await Hive.initFlutter();
  await Hive.openBox("events");

}

保存数据列表时

final eventsBox = Hive.box("events");
eventsBox.put("recommended_events",eventsFromServer);

然后像这样阅读

final eventsBox = Hive.box("events");
final eventsFromHive = eventsBox.get("recommended_events")?.cast<Event>() ?? [];