在 Flutter 中保存 IconData 并恢复

Bar*_*ska 3 flutter

我正在构建一个应用程序,我在其中使用 IconData 类创建图标。我想将图标以字符串或整数等格式存储到数据库中并检索它,然后方便地转换回图标。

这就是我创建图标的方式。

var iconData = IconData(58717, fontFamily: 'MaterialIcons')

var icon = Icon(iconData)
Run Code Online (Sandbox Code Playgroud)

有人可以建议如何做到这一点。转换可以在 IconData 或 Icon 创建阶段完成。谢谢。

Bar*_*ska 15

我找到了一种方法来使用 IconData 类的一个名为 codePoint 的属性,它是一个表示图标的 int。

var iconData = IconData(58717, fontFamily: 'MaterialIcons')

// Store this in the database
var icon iconCodePoint = iconData.codePoint;

// Restore from the database to get icon
var iconData = IconData(iconCodePointFromDataBase, fontFamily: 'MaterialIcons');
Run Code Online (Sandbox Code Playgroud)


Kal*_*ani 7

那么,您不需要将 IconData 保存在数据库中,您可以创建一个 dart 文件来将 IconData 保存在静态 const 字段中。但是,根据您的用例,您可以执行以下操作来达到您的目的。

第一个选项:

IconData 类的属性是 int、String 或 bool,这些数据类型被数据库接受,因此您应该将每个图标保存在列类型为 int、String 的表行中,对于 bool,您可以使用 int。

使用该表的主键作为要与该图标链接的主数据的外键。

第二个选项:

将 Icondata 转换为 JSONString 并将其保存到数据库或首选项中。如果您不知道如何从 IconData 创建 JSONString 或反之亦然,那么以下代码供您参考:

import 'dart:convert';

import 'package:flutter/material.dart';

String toJSONString(IconData data) {
  Map<String, dynamic> map = <String, dynamic>{};
  map['codePoint'] = data.codePoint;
  map['fontFamily'] = data.fontFamily;
  map['fontPackage'] = data.fontPackage;
  map['matchTextDirection'] = data.matchTextDirection;
  return jsonEncode(map);
}

IconData fromJSONString(String jsonString) {
  Map<String, dynamic> map = jsonDecode(jsonString);
  return IconData(
    map['codePoint'],
    fontFamily: map['fontFamily'],
    fontPackage: map['fontPackage'],
    matchTextDirection: map['matchTextDirection'],
  );
}
Run Code Online (Sandbox Code Playgroud)

如有疑问,请评论。如果它对您有用,请不要忘记接受并投票。