Попытка вставить данные как большой двоичный объект, получение ошибки аргумента - PullRequest
1 голос
/ 23 сентября 2019

в моем проекте Flutter у меня есть класс Category, который содержит String, Icon, IconData и два цвета: (я не хочу сохранять значок, потому что я могу воссоздать его с помощью iconData)

class Category {
  Icon icon;
  IconData iconData;
  Color color;
  Color backgroundcolor;
  String name;

[...]

Map<String, dynamic> toMap() {
    return {
      'iconData': iconData,
      'color': color,
      'backgroundcolor': backgroundcolor,
      'name': name
    };
  }

для моего проекта я импортировал базу данных sqflite, создал таблицу категорий (с «CREATE TABLE Categories (имя TEXT, iconData BLOB, color BLOB, backgroundcolor BLOB»)) и теперь хочу вставить категорию в мою базу данных с помощью следующего:

Future<void> insertCategory(Category category) async {
  // get reference to the database
  final Database db = await database;

  // insert new category
  await db.insert('categories', category.toMap(),
      conflictAlgorithm: ConflictAlgorithm.replace);

  print("Category inserted.");
}

Но когда я пытаюсь вставить категорию, я получаю сообщение об ошибке аргумента (неверный аргумент: экземпляр 'IconData') и не могу понять, в чем проблема.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Мой обходной путь следующий:

Создание базы данных с

CREATE TABLE categories( iconData INTEGER, backgroundcolor INTEGER, name TEXT PRIMARY KEY)

My toMap () is

Map<String, dynamic> toMap() {
// Color is stored in a 32-bit integer with alpha, red, green, blue -> ARGB
int bc = backgroundcolor.alpha << 8;
bc = bc + backgroundcolor.red << 8;
bc = bc + backgroundcolor.green << 8;
bc = bc + backgroundcolor.blue;
return {
  'iconData': iconData.codePoint,
  'backgroundcolor': bc,
  'name': name
};

Я прочиталмои категории с

Future<List<Category>> getCategoriesFromDatabase() async {
  // get reference to database
  final Database db = await database;

  // Query the table for all categories
  final List<Map<String, dynamic>> maps = await db.query('categories');

  print("Categories read.");
  // Convert the List<Map<String, dynamic> into a List<Category>
  return List.generate(maps.length, (i) {
    // Construct backgroundcolor
    Color bc = Color(maps[i]['backgroundcolor']);
    // Construct iconData
    IconData id =
        IconData(maps[i]['iconData'], fontFamily: Icons.ac_unit.fontFamily);
    return Category(
      name: maps[i]['name'],
      iconData: id,
      backgroundcolor: bc,
    );
  });
}

Этот обходной путь должен работать для большинства типов данных.Например, я использую то же решение для хранения дат.Я сохраняю год, месяц, день, и при чтении из БД я строю дату дротика.

0 голосов
/ 24 сентября 2019

Вы можете сохранить данные значка с типом String
, и вам нужно сопоставить строку со значком с вашим значком: либо Icons, либо FontAwesomeIcons, либо ...

Map<String, IconData> iconMapping = {
  'facebook' : FontAwesomeIcons.facebook,
  'twitter' : FontAwesomeIcons.twitter,
  'home' : FontAwesomeIcons.home,
  'audiotrack' : Icons.audiotrack,
};

@override
Widget build(BuildContext context) {
  return Icon(iconMapping [icon], color: HexColor(color));
}

Аналогичный вопрос и ответ
Попытка динамически установить значок на основе строкового значения JSON
Флаттер: отображение различных значков в зависимости от значения

...