dart Flutter Hive商店颜色

9gm1akwq  于 2023-10-13  发布在  Flutter
关注(0)|答案(4)|浏览(122)

我需要在我的Hive数据库中存储颜色,以便在我的电子商务应用程序中检索,它给了我下面的错误,说我需要制作一个适配器,有人能告诉我如何制作一个颜色适配器吗?

part 'items_model.g.dart';

@HiveType(typeId: 0)
class Item {
  @HiveField(0)
  final String name;
  @HiveField(1)
  final double price;
  @HiveField(2)
  final String? description;
  @HiveField(3)
  var image;
  @HiveField(4)
  final String id;
  @HiveField(5)
  final String shopName;
  @HiveField(6)
  final List<Category> category;
  @HiveField(7)
  Color? color;
  @HiveField(8)
  int? quantity;
  Item({
    required this.category,
    required this.image,
    required this.name,
    required this.price,
    this.description,
    required this.id,
    required this.shopName,
    this.color,
    required this.quantity,
  });


}

有谁知道如何生成或创建颜色适配器?因为我不知道如何

E/flutter ( 4621): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: HiveError: Cannot write, unknown type: MaterialColor. Did you forget to register an adapter?
c6ubokkw

c6ubokkw1#

我认为这里最简单的方法是存储颜色的int值。
举个例子

final colorValue = Colors.blue.value; // colorValue is an integer here

所以你的Hive颜色可以这样存储

@HiveField(7)
int? colorValue;

然后,在您的应用程序中,当您从存储中创建颜色时,它看起来像这样。

final item = Item(...however you initialize your Item);

final color = Color(item.colorValue);
hl0ma9xz

hl0ma9xz2#

基于@Cryptozord和@Loren之前的回答。一个人可以简单地为颜色编写特定的适配器

import 'package:flutter/cupertino.dart';
import 'package:hive/hive.dart';

class ColorAdapter extends TypeAdapter<Color> {
  @override
  final typeId = 221;

  @override
  Color read(BinaryReader reader) => Color(reader.readUint32());

  @override
  void write(BinaryWriter writer, Color obj) => writer.writeUint32(obj.value);
}

并记住将适配器注册到

Hive.registerAdapter(ColorAdapter());

确保您的typeId没有被其他模型占用
现在您可以使用

@HiveField(7)
Color? colorValue;
e5njpo68

e5njpo683#

我为此困惑了一整天,我想出了如何做到这一点。你应该像这样手动创建你的适配器:

class ItemAdapter extends TypeAdapter<Item> {
  @override
  final typeId = 0;

  @override
  ThemeState read(BinaryReader reader) {
    return Item(
       color: Color(reader.readUint32()),
       //the rest of the fields here
     );
    }

  @override
  void write(BinaryWriter writer, ThemeState obj) {
    writer.writeUint32(obj.color.value);
    writer.writeString(obj.name);
    //the rest of the fields here
  }
}

Color需要保存并写入为Uint 32值,因为Int 32值的范围仅为-2147483648至2147483647,无符号整数为0至4294967295。Color()的整数值可以超过2147483647。如果不使用Uint 32,则值将无法正确存储,并且会保存奇怪的颜色。

bnlyeluc

bnlyeluc4#

在hive的最后一次更新中,实际上有一个默认的颜色适配器,您可以通过导入

import 'package:hive_flutter/adapters.dart';

它基本上与Markos Evlogimenos' answer中的适配器相同,但您不必自己编写任何东西。我通过跟随他的例子偶然发现了这一点,并偶然发现了上面的一个导入选项。

相关问题