如何保存列表< object>并使用hive检索?

bxjv4tth  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(456)

我有一个壁纸应用程序,它使用firestore来存储壁纸。
我想使用hive存储cloud firestore中的墙纸列表,但如何保存墙纸列表并稍后检索?
当我试图保存列表时,出现以下错误:
e/Flutter(9995):[error:flutter/shell/common/shell.cc(199)]dart错误:未处理的异常:e/flatter(9995):hiveerror:无法写入,未知类型:wallpaper。你忘记注册适配器了吗?
代码:

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;

  }
hpxqektj

hpxqektj1#

您必须使用@hivetype()指定对象。并且必须注册您的对象配置单元。registeradapter(wallperAdapter(),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 功能。就在runapp之前
您的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函数,因此此命令将生成所需的文件

2g32fytz

2g32fytz2#

我通过在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模型需要增加这个数量。所以每个值都是唯一的(我猜是连续的,但我没有对此进行测试)。

相关问题