Как использовать шестнадцатеричные цветные строки в Flutter?

214

Как преобразовать цвета строки шестнадцатеричных как #b74093к Colorв флаттере?

creativecreatorormaybenot
источник

Ответы:

350

Во Flutter Colorкласс принимает только целые числа в качестве параметров , или есть возможность использовать именованные конструкторы fromARGBи fromRGBO.

Таким образом, нам нужно только преобразовать строку #b74093в целочисленное значение. Также мы должны уважать, что непрозрачность всегда должна быть указана.
255(полная) непрозрачность представлена ​​шестнадцатеричным значением FF. Это уже оставляет нас с 0xFF. Теперь нам просто нужно добавить нашу цветовую строку следующим образом:

const color = const Color(0xffb74093); // Second `const` is optional in assignments.

Буквы могут быть выбраны с большой буквы или нет:

const color = const Color(0xFFB74093);

Начиная с Dart 2.6.0, вы можете создатьextensionColor класс для класса, который позволяет использовать шестнадцатеричные строки цвета для создания Colorобъекта:

extension HexColor on Color {
  /// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#".
  static Color fromHex(String hexString) {
    final buffer = StringBuffer();
    if (hexString.length == 6 || hexString.length == 7) buffer.write('ff');
    buffer.write(hexString.replaceFirst('#', ''));
    return Color(int.parse(buffer.toString(), radix: 16));
  }

  /// Prefixes a hash sign if [leadingHashSign] is set to `true` (default is `true`).
  String toHex({bool leadingHashSign = true}) => '${leadingHashSign ? '#' : ''}'
      '${alpha.toRadixString(16).padLeft(2, '0')}'
      '${red.toRadixString(16).padLeft(2, '0')}'
      '${green.toRadixString(16).padLeft(2, '0')}'
      '${blue.toRadixString(16).padLeft(2, '0')}';
}

fromHexМетод также может быть объявлен в mixinили classпотому , что HexColorимя должно быть явно указано для того , чтобы использовать его, но расширение полезно для toHexметода, который может быть использован в неявном виде . Вот пример:

void main() {
  final Color color = HexColor.fromHex('#aabbcc');

  print(color.toHex());
  print(const Color(0xffaabbcc).toHex());
}

Недостаток использования шестнадцатеричных строк

Многие другие ответы здесь показывают, как вы можете динамически создать Colorиз шестнадцатеричной строки, как я делал выше. Однако это означает, что цвет не может быть const.
В идеале вы должны назначать свои цвета так, как я объяснил в первой части этого ответа, что более эффективно при многократном создании экземпляров цветов, что обычно имеет место для виджетов Flutter.

creativecreatorormaybenot
источник
У вас еще нет статического расширения метода в дротике github.com/dart-lang/language/issues/723
Лукаш Вишневский
1
@ ŁukaszWiśniewski Да, вы можете;) Вы просто не можете вызвать их, используя расширенный класс ( HexColor.fromHexработает, но Color.fromHexне работает).
creativecreatorormaybenot
Я просто удивлен, что вы можете передать 0xFF как часть int
Хэмиш Джонсон
@HamishJohnson 0xпросто указывает, что следующие цифры будут проанализированы как шестнадцатеричные 🙃
creativecreatorormaybenot
136

ColorКласс ожидает , что целое число ARGB. Поскольку вы пытаетесь использовать его со RGBзначением, представьте его как int и добавьте к нему префикс 0xff.

Color mainColor = Color(0xffb74093);

Если вас это раздражает и вы все еще хотите использовать строки, вы можете расширить Colorи добавить конструктор строк

class HexColor extends Color {
  static int _getColorFromHex(String hexColor) {
    hexColor = hexColor.toUpperCase().replaceAll("#", "");
    if (hexColor.length == 6) {
      hexColor = "FF" + hexColor;
    }
    return int.parse(hexColor, radix: 16);
  }

  HexColor(final String hexColor) : super(_getColorFromHex(hexColor));
}

использование

Color color1 = HexColor("b74093");
Color color2 = HexColor("#b74093");
Color color3 = HexColor("#88b74093"); // if you wish to use ARGB format
Йосеф Харуш
источник
это действительно здорово! также работает с LinearGradient.
xhinoda
класс HexColor у меня не работает для MaterialColor, он продолжает жаловаться на второй параметр. Пожалуйста, помогите здесь
leeCoder
21

Если вы хотите использовать шестнадцатеричный код цвета в этом формате # 123456, тогда его очень легко использовать, создайте переменные типа Color и присвойте ему следующие значения.

Color myHexColor = Color(0xff123456) 

// her you notice I use the 0xff and that is opacity or transparency of the color 
// and you can also change these value .

используйте myhexcolor и вы готовы к работе.

если вы хотите изменить непрозрачность цвета непосредственно из шестнадцатеричного кода, тогда измените значение ff в 0xff на значение соответственно из таблицы ниже.

Шестнадцатеричные значения непрозрачности

100% - FF

95% - F2

90% - E6

85% - D9

80% - СС

75% - BF

70% - B3

65% - А6

60% - 99

55% - 8C

50% - 80

45% - 73

40% - 66

35% - 59

30% - 4D

25% - 40

20% - 33

15% - 26

10% - 1А

5% - 0D

0% - 00

Закрия Хан
источник
1
Это хорошая идея, чтобы сохранить эту ссылку, хотя .withOpacity (0.2) достаточно полезен в большинстве случаев.
Гаурис Хавьер
18

Чтобы преобразовать шестнадцатеричную строку в int, выполните:

int hexToInt(String hex)
{
  int val = 0;
  int len = hex.length;
  for (int i = 0; i < len; i++) {
    int hexDigit = hex.codeUnitAt(i);
    if (hexDigit >= 48 && hexDigit <= 57) {
      val += (hexDigit - 48) * (1 << (4 * (len - 1 - i)));
    } else if (hexDigit >= 65 && hexDigit <= 70) {
      // A..F
      val += (hexDigit - 55) * (1 << (4 * (len - 1 - i)));
    } else if (hexDigit >= 97 && hexDigit <= 102) {
      // a..f
      val += (hexDigit - 87) * (1 << (4 * (len - 1 - i)));
    } else {
      throw new FormatException("Invalid hexadecimal value");
    }
  }
  return val;
}

Пример звонка:

Color color=new Color(hexToInt("FFB74093"));
Rockvole
источник
18

Простая функция без использования класса:

Color _colorFromHex(String hexColor) {
  final hexCode = hexColor.replaceAll('#', '');
  return Color(int.parse('FF$hexCode', radix: 16));
}

Вы можете использовать это так:

Color color1 = _colorFromHex("b74093");
Color color2 = _colorFromHex("#b74093");
Элвин Конда
источник
1
Спасибо @ jeroen-meijer для редактирования. На самом деле, вы можете использовать и этот лайнер, если вам нравитсяColor(int.parse('#000000'.replaceAll('#', '0xff')))
Alvin Konda
16

Простой способ :

String color = yourHexColor.replaceAll('#', '0xff');

Использование:

Container(
    color: Color(int.parse(color)),
)
Сердар Полат
источник
14

Есть другое решение. Если вы сохраняете свой цвет как обычную шестнадцатеричную строку и не хотите добавлять к ней непрозрачность (начиная с FF): 1) Преобразуйте вашу шестнадцатеричную строку в int. Чтобы преобразовать шестнадцатеричную строку в целое число, выполните одно из следующих действий:

var myInt = int.parse(hexString, radix: 16);

или

var myInt = int.parse("0x$hexString");

в качестве префикса 0x (или -0x) по умолчанию для int.parse устанавливается основание 16.

2) Добавьте непрозрачность к вашему цвету через код

Color color = new Color(myInt).withOpacity(1.0);
Евгений Кот
источник
1
Мне нужен был «ведущий FF» для Флаттера ThemeData.
creativecreatorormaybenot
Мне нравится это решение за его простоту, но, как упомянул @creativecreatorormaybenot, ведущий FF по-прежнему требуется.
KevinM
7

Во Flutter создайте цвет из RGB с альфа, используйте

return new Container(
  color: new Color.fromRGBO(0, 0, 0, 0.5),
);

Как использовать hex-цвет:

return new Container(
  color: new Color(0xFF4286f4),
);
//0xFF -> the opacity (FF for opaque)
//4286f4 -> the hex-color

Hex-цвет с непрозрачностью:

return new Container(
  color: new Color(0xFF4286f4).withOpacity(0.5),
);

// или изменить значение "FF"

100%FF
 95%F2
 90%E6
 85%D9
 80%CC
 75%BF
 70%B3
 65%A6
 60%99
 55%8C
 50%80
 45%73
 40%66
 35%59
 30%4D
 25%40
 20%33
 15%26
 10%1A
 5%0D
 0%00

Для получения дополнительной информации перейдите по официальной ссылке https://api.flutter.dev/flutter/dart-ui/Color-class.html.

Амит Праджапати
источник
5

utils.dart

///
/// Convert a color hex-string to a Color object.
///
Color getColorFromHex(String hexColor) {
  hexColor = hexColor.toUpperCase().replaceAll('#', '');

  if (hexColor.length == 6) {
    hexColor = 'FF' + hexColor;
  }

  return Color(int.parse(hexColor, radix: 16));
}

пример использования

Text(
  'hello world',
  style: TextStyle(
    color: getColorFromHex('#aabbcc'),
    fontWeight: FontWeight.bold,
  )
)
Майкл П. Базос
источник
5

Для общего ознакомления. Существует более простой способ использования библиотеки Supercharged . Несмотря на то, что вы можете использовать методы расширения со всеми упомянутыми решениями, вы найдете практический набор пользовательских библиотек.

"#ff00ff".toColor(); // painless hex to color
"red".toColor(); // supports all web color names

Проще, правда?

Перегруженный

Гаурис Хавьер
источник
4

"#b74093"? ХОРОШО...

К HEX рецепту

int getColorHexFromStr(String colorStr)
{
  colorStr = "FF" + colorStr;
  colorStr = colorStr.replaceAll("#", "");
  int val = 0;
  int len = colorStr.length;
  for (int i = 0; i < len; i++) {
    int hexDigit = colorStr.codeUnitAt(i);
    if (hexDigit >= 48 && hexDigit <= 57) {
      val += (hexDigit - 48) * (1 << (4 * (len - 1 - i)));
    } else if (hexDigit >= 65 && hexDigit <= 70) {
      // A..F
      val += (hexDigit - 55) * (1 << (4 * (len - 1 - i)));
    } else if (hexDigit >= 97 && hexDigit <= 102) {
      // a..f
      val += (hexDigit - 87) * (1 << (4 * (len - 1 - i)));
    } else {
      throw new FormatException("An error occurred when converting a color");
    }
  }
  return val;
}
Науэль Алехандро Кабрера
источник
4
import 'package:flutter/material.dart';
class HexToColor extends Color{
  static _hexToColor(String code) {
    return int.parse(code.substring(1, 7), radix: 16) + 0xFF000000;
  }
  HexToColor(final String code) : super(_hexToColor(code));
}

Импортируйте новый класс и используйте его следующим образом HexToColor('#F2A03D')

watchdog0x
источник
3

Я пропустил очевидный ответ, используя шестнадцатеричные числа для конструктора fromRGB:

Color.fromRGBO(0xb7, 0x40, 0x93, 1),
Адам
источник
1

Вы можете нажать на Color Widget, и он расскажет вам гораздо глубже о том, как эти буквы обозначают. Вы также можете использовать метод Color.fromARGB () для создания пользовательских цветов, что намного проще для меня. Используйте веб-сайт Flutter Doctor Color Picker, чтобы выбрать любой цвет, который вы хотите для своего приложения флаттера.

EyoelD
источник
1
String hexString = "45a3df";
Color(int.parse("0xff${hexString}"));

Не знаю, почему это сбито, это было решением для меня.
Единственный способ, который не требует дополнительных шагов

Рио Вебер
источник
0

Вы можете использовать этот пакет from_css_color, чтобы выйти Colorиз шестнадцатеричной строки. Он поддерживает как трех-, так и шестизначную шестнадцатеричную запись RGB.

Color color = fromCSSColor('#ff00aa')

Для оптимизации создайте экземпляр Color один раз для каждого цвета и сохраните его где-нибудь для дальнейшего использования.

Алекс Мызников
источник