问题描述
抱歉,我刚开始使用 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 将生成模型,但您也必须按照文档说明创建模型。 >
我建议您查看文档。
,我终于可以像这样使用它来解决它了。在主函数中
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>() ?? [];