【问题标题】:how to solve dynamic list type casting error in Hive?如何解决 Hive 中的动态列表类型转换错误?
【发布时间】:2023-03-02 21:27:01
【问题描述】:

对不起,我是使用 Flutter 和使用 Hive 本地存储的新手。

我正在使用

  hive: ^2.0.4
  hive_flutter: ^1.0.0

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

Future<void> main() async {

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

}

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

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 类型 地图)。使用 list.cast() 将它们转换为 具体类型。

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

我是这样尝试的,但我仍然有同样的错误

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

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

【问题讨论】:

  • final eventsFromHive = eventsBox.get("recommended_events", defaultValue: &lt;Event&gt;[]) ?? [];
  • @sajithlakmal 不幸的是它不起作用:(
  • 你是什么Event对象
  • 您能否发布您的事件模型类定义

标签: flutter flutter-hive


【解决方案1】:

没有必要将你的盒子作为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 将生成模型,但您还必须按照文档说明创建模型。 p>

我建议你查看文档。

Hive - Generate Adapter

【讨论】:

    【解决方案2】:

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

    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>() ?? [];
    

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2014-05-16
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      相关资源
      最近更新 更多