如何使用 Hive 保存 List<Object> 和检索?
How to save a List<Object> and retrieve using Hive?
我有一个壁纸应用程序,它使用 Firestore 来存储壁纸。
我想使用 Hive 存储来自 cloud firestore 的壁纸列表,但如何保存壁纸列表并在以后检索它?
当我尝试保存列表时出现此错误:
E/flutter ( 9995): [ERROR:flutter/shell/common/shell.cc(199)] Dart Error: Unhandled exception:
E/flutter ( 9995): HiveError: Cannot write, unknown type: Wallpaper. Did you forget to register an adapter?
代码:
class Wallpaper extends HiveObject {
String date;
String url;
Wallpaper();
}
static Future<void> addWallpapers({@required String boxName, @required List<Wallpaper> wallpapers}) async {
var box = await Hive.openBox(boxName);
box.put(boxName, wallpapers);
print("WALLPAPER ADICIONADO NO HIVE!");
}
static Future<List<Wallpaper>> getWallpapers({@required String boxName}) async {
var box = await Hive.openBox(boxName);
List<Wallpaper> wallpapers = box.get("latest");
return wallpapers;
}
您必须使用@HiveType() 注释您的对象。并且必须注册您的对象 Hive.registerAdapter(WallpaperAdapter(), 0);.
然而,您是否有 part 'wallpaper.g.dart';
来生成所需的代码?
已编辑:
首先导入对你的 pubspec 的依赖:
dependencies:
hive: ^[version]
hive_flutter: ^[version]
dev_dependencies:
hive_generator: ^[version]
build_runner: ^[version]
您应该将 Hive.registerAdapter(MyObjectAdapter(), 0);
放入 main.dart
函数中。就在 运行App
之前
您的 HiveObject 应该有这样的注释:
@HiveType()
class Person extends HiveObject {
@HiveField(0);
String name;
@HiveField(1);
int age;
}
将此命令放在终端上的导入 part 'person.g.dart';
和 运行 代码生成附近。 flutter packages pub run build_runner build
.
带有代码生成的Hive函数,所以这个命令会生成你需要的文件
我通过在 HiveType 上包含一个实际 ID 解决了这个问题。
像这样:
@HiveType(typeId: 0)
class SoundSingle {
@HiveField(0)
final String name;
@HiveField(1)
final String fileName;
@HiveField(2)
int volume;
SoundSingle(this.name,this.fileName, this.volume);
}
更多的 HiveType 模型需要增加数量。所以每个值都是唯一的(我猜是顺序的,但我没有对此进行测试)。
我有一个壁纸应用程序,它使用 Firestore 来存储壁纸。
我想使用 Hive 存储来自 cloud firestore 的壁纸列表,但如何保存壁纸列表并在以后检索它?
当我尝试保存列表时出现此错误:
E/flutter ( 9995): [ERROR:flutter/shell/common/shell.cc(199)] Dart Error: Unhandled exception: E/flutter ( 9995): HiveError: Cannot write, unknown type: Wallpaper. Did you forget to register an adapter?
代码:
class Wallpaper extends HiveObject {
String date;
String url;
Wallpaper();
}
static Future<void> addWallpapers({@required String boxName, @required List<Wallpaper> wallpapers}) async {
var box = await Hive.openBox(boxName);
box.put(boxName, wallpapers);
print("WALLPAPER ADICIONADO NO HIVE!");
}
static Future<List<Wallpaper>> getWallpapers({@required String boxName}) async {
var box = await Hive.openBox(boxName);
List<Wallpaper> wallpapers = box.get("latest");
return wallpapers;
}
您必须使用@HiveType() 注释您的对象。并且必须注册您的对象 Hive.registerAdapter(WallpaperAdapter(), 0);.
然而,您是否有 part 'wallpaper.g.dart';
来生成所需的代码?
已编辑: 首先导入对你的 pubspec 的依赖:
dependencies:
hive: ^[version]
hive_flutter: ^[version]
dev_dependencies:
hive_generator: ^[version]
build_runner: ^[version]
您应该将 Hive.registerAdapter(MyObjectAdapter(), 0);
放入 main.dart
函数中。就在 运行App
您的 HiveObject 应该有这样的注释:
@HiveType()
class Person extends HiveObject {
@HiveField(0);
String name;
@HiveField(1);
int age;
}
将此命令放在终端上的导入 part 'person.g.dart';
和 运行 代码生成附近。 flutter packages pub run build_runner build
.
带有代码生成的Hive函数,所以这个命令会生成你需要的文件
我通过在 HiveType 上包含一个实际 ID 解决了这个问题。 像这样:
@HiveType(typeId: 0)
class SoundSingle {
@HiveField(0)
final String name;
@HiveField(1)
final String fileName;
@HiveField(2)
int volume;
SoundSingle(this.name,this.fileName, this.volume);
}
更多的 HiveType 模型需要增加数量。所以每个值都是唯一的(我猜是顺序的,但我没有对此进行测试)。