Попытка динамически установить Icon на основе строкового значения JSON - PullRequest
0 голосов
/ 05 марта 2019

У меня есть клиентский конфиг, который находится на сервере в формате 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 операторов switch для 500 шрифтов?формат

FontAwesomeIcons.facebook, где мое строковое значение "facebook" будет добавлено в конец FontAwesomeIcons.Я ищу способ написать все, что я хочу в строке, и он вернет правильный значок виджета.

1 Ответ

0 голосов
/ 05 марта 2019

Существует два способа устранения дублирования кода.

  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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...