#dart #flutter
#dart #трепетание
Вопрос:
У меня есть конфигурация клиента, которая находится на сервере в формате 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 значков font awesome? формат является
FontAwesomeIcons.facebook
где мое строковое значение facebook будет добавляться в конце FontAwesomeIcons. Я ищу способ просто написать все, что я хочу, в строке, и это вернет правильный виджет значка.
Комментарии:
1. Вот отличный вариант использования для размышления. Однако это невозможно во flutter. Однако существует пакет под названием ‘Reflectable’, который выполняет генерацию кода (?). Возможно, на это стоит обратить внимание.
Ответ №1:
Есть два способа, которыми вы можете устранить некоторые дублирования вашего кода.
- Извлекая переключатель и перемещая его в свою собственную функцию, чтобы в вашем методе сборки не было дублирования.
Оператор Switch
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));
}
Комментарии:
1. Я собираюсь принять ваш ответ, потому что он отвечает на мой вопрос и является лучшим кодом, чем то, что я собирался сделать, но в итоге я просто использовал целочисленное значение значка и преобразовал свой JSON-файл из имен на основе строк в значения значков на основе int, поскольку преобразование 13 значков потребовало меньше усилий, чем поддержка 500 строк на карте.
2. @Zuriel хороший выбор. Также лучше для долгосрочного обслуживания.
3. это должен быть лучший способ. В результате у нас получается по одному регистру для каждого значка. Для этих трех все в порядке. Но у меня есть список из 50 таких
4. Хотелось бы, чтобы у flutter была такая функция, как IconData.from(«icon_name»)
Ответ №2:
Для достижения этого просто следуйте приведенным ниже шагам.
-
Загрузите пакет [icons_helper]: https://pub.dev/packages/icons_helper из пакетов flutter
-
Просто добавьте приведенный ниже код везде, где вы хотите динамический значок, используя JSON.
a) Значок FontAwesome: getIconGuessFavorFA (имя: «ICON_NAME»)
б) Значок материала: получите пользовательский материал (имя: «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(),
)
Примечание: Если вы столкнулись с какой-либо ошибкой при выполнении like (‘Ошибка: средство получения не найдено: ‘haykal’.’). Просто прокомментируйте значок в ‘icons_helper.dart’
Комментарии:
1. Должен быть принятый ответ 1
Ответ №3:
Я использовал пакет reflectable и смог нормально отразить существующие модули. Вот примеры для цветов и констант значков.
import 'package:flutter/material.dart';
@GlobalQuantifyCapability(r"Icons",constReflector)
@GlobalQuantifyCapability(r"Colors",constReflector)
import 'package:reflectable/reflectable.dart';
import 'adaptive_icons.reflectable.dart'; // Import generated code.
class ConstReflector extends Reflectable {
const ConstReflector()
: super(declarationsCapability,staticInvokeCapability);
}
const constReflector = ConstReflector();
dynamic colorFromName(String name) {
ClassMirror m = constReflector.reflectType(Colors);
return m.invokeGetter(name);
}
dynamic iconFromName(String name) {
ClassMirror m = constReflector.reflectType(Icons);
return m.invokeGetter(name);
}
Ответ №4:
Используйте этот пакет
awesome_icons: ^1.1.0
import 'package:awesome_icons/awesome_icons.dart';
Icon(
fontAwesomeIcons['Icon_name'],
size: 24.0,
),