尝试根据JSON字符串值动态设置图标

时间:2019-03-05 17:23:25

标签: dart flutter

我在JSON格式的服务器上有一个客户端配置。

示例JSON类似于{“ icon”:“ facebook”}

我在下面有小部件。

    class MySocialIcons extends StatelessWidget {

    MySocialIcons({this.icon, this.color});

    final String icon;
    final String color;

    @override
    Widget build(BuildContext context) {

    switch(icon) {
      case 'facebook': {
        return Icon(FontAwesomeIcons.facebook, color: HexColor(color));
      }
      break;

      case 'twitter': {
        return Icon(FontAwesomeIcons.twitter, color: HexColor(color));
      }
      break;

      default: {
        return Icon(FontAwesomeIcons.home, color: HexColor(color));
      }
      break;
    }
  }
}

有没有一种方法不必为500个字体很棒的图标编写500个switch语句?格式为

FontAwesomeIcons.facebook,其中我的字符串值“ facebook”将附加在FontAwesomeIcons的末尾。我正在寻找一种只在字符串中写入所需内容的方法,它会返回正确的图标小部件。

3 个答案:

答案 0 :(得分:2)

只需执行以下步骤即可。

  1. 从flift软件包中下载软件包[icons_helper]:https://pub.dev/packages/icons_helper

  2. 只需在需要使用JSON的动态图标的任何地方添加以下代码即可。

    a)FontAwesome图标:getIconGuessFavorFA(名称:“ ICON_NAME”)

    b)材质图标:getIconGuessFavorMaterial(名称:“ ICON_NAME”)

示例:

ExpansionTile(
  leading:  Icon(getIconGuessFavorMaterial(name:root.menuIcon)),  //Icon(FontAwesomeIcons.dashcube),            
  key: PageStorageKey<MobileMenuList>(root),
  title: Text(root.menuName),
  children: root.children.map(_buildTiles).toList(),
)

注意:如果您在遵守规则时遇到任何错误(“错误:未找到Getter:'haykal'。”)。只需评论“ icons_helper.dart”中的图标

答案 1 :(得分:0)

有两种方法可以消除某些代码重复。

  1. 通过取出开关并将其移至其自己的功能中,因此您的构建方法不会重复。

切换语句

 IconData getIconForName(String iconName) {
      switch(iconName) {
        case 'facebook': {
        return FontAwesomeIcons.facebook;
        }
        break;

        case 'twitter': {
          return FontAwesomeIcons.twitter;
        }
        break;

        default: {
          return FontAwesomeIcons.home;
        }
      }
    }

构建功能

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

或2。创建地图

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

构建功能

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

答案 2 :(得分:0)

我使用了可反射的软件包,并且能够很好地反射现有模块。 这是颜色和图标常量的示例。

for clabel in clustered_labels:
    new_clusters.append(
        kmeans_conv1.cluster_centers_[clabel][0]
    )