Jak korzystać z ciągów kolorów szesnastkowych w Flutter?

214

Jak przekonwertować szesnastkowy ciąg koloru jak #b74093na ColorFlutter?

creativecreatorormaybenot
źródło

Odpowiedzi:

348

W Flutter Colorklasa przyjmuje tylko liczby całkowite jako parametry lub istnieje możliwość użycia nazwanych konstruktorów fromARGBi fromRGBO.

Musimy tylko przekonwertować ciąg #b74093na wartość całkowitą. Musimy także uszanować, że zawsze należy określać krycie .
255(pełne) krycie jest reprezentowane przez wartość szesnastkową FF. To już nas pozostawia 0xFF. Teraz musimy tylko dołączyć nasz ciąg kolorów w następujący sposób:

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

Litery mogą być z wyboru pisane wielkimi literami lub nie:

const color = const Color(0xFFB74093);

Począwszy od Dart 2.6.0, możesz utworzyćextension dla Colorklasy, która pozwala używać ciągów kolorów szesnastkowych do tworzenia Colorobiektu:

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')}';
}

fromHexMetoda może być również uznane w sposób mixinalbo classdlatego, że HexColornazwa musi być wyraźnie określony w celu wykorzystania go, ale rozszerzenie jest użyteczny dla toHexsposobu, który może być używany w sposób dorozumiany. Oto przykład:

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

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

Wada używania ciągów szesnastkowych

Wiele innych odpowiedzi tutaj pokazuje, jak możesz dynamicznie utworzyć Colorciąg szesnastkowy, tak jak ja powyżej. Jednak wykonanie tego oznacza, że ​​kolor nie może być const.
Najlepiej byłoby przypisać kolory w sposób opisany w pierwszej części tej odpowiedzi, co jest bardziej wydajne przy częstym tworzeniu instancji kolorów, co zwykle ma miejsce w przypadku widżetów Flutter.

creativecreatorormaybenot
źródło
Nie możesz mieć jeszcze statycznego rozszerzenia metody w dart github.com/dart-lang/language/issues/723
Łukasz Wiśniewski
1
@ ŁukaszWiśniewski Tak, możesz;) Po prostu nie możesz do nich dzwonić za pomocą rozszerzonej klasy ( HexColor.fromHexdziała, ale Color.fromHexnie działa).
creativecreatorormaybenot
Jestem zaskoczony, że możesz przekazać 0xFF w ramach int
Hamish Johnson
@HamishJohnson 0xpo prostu wskazuje, że następujące cyfry zostaną przeanalizowane jako szesnastkowy 🙃
creativecreatorormaybenot
135

ColorKlasy oczekuje całkowitą ARGB. Ponieważ próbujesz użyć go z RGBwartością, przedstaw go jako int i przedrostek 0xff.

Color mainColor = Color(0xffb74093);

Jeśli denerwujesz się tym i nadal chcesz używać ciągów, możesz rozszerzyć Colori dodać konstruktor ciągów

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));
}

stosowanie

Color color1 = HexColor("b74093");
Color color2 = HexColor("#b74093");
Color color3 = HexColor("#88b74093"); // if you wish to use ARGB format
Jossef Harush
źródło
to jest naprawdę świetne! współpracuje również z LinearGradient.
xhinoda
klasa HexColor nie działała dla mnie dla MaterialColor, ciągle narzeka na drugi parametr. Proszę o pomoc tutaj
leeCoder
20

jeśli chcesz użyć szesnastkowego kodu koloru, który jest w tym formacie # 123456, to bardzo łatwo go użyć, utwórz zmienne typu Color i przypisz mu następujące wartości.

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 .

użyj myhexcolor i jesteś gotowy do pracy.

jeśli chcesz zmienić krycie koloru bezpośrednio z kodu szesnastkowego, zmień wartość ff w 0xff na odpowiednio wartość z poniższej tabeli.

Wartości krycia szesnastkowego

100% - FF

95% - F2

90% - E6

85% - D9

80% - CC

75% - BF

70% - B3

65% - A6

60% - 99

55% - 8 ° C

50% - 80

45% - 73

40% - 66

35% - 59

30% - 4D

25% - 40

20% - 33

15% - 26

10% - 1A

5% - 0D

0% - 00

Zakria Khan
źródło
1
Warto zapisać to odwołanie, chociaż .withOpacity (0.2) jest wystarczająco użyteczne w większości przypadków.
Gauris Javier
18

Aby przekonwertować z ciągu szesnastkowego na int, wykonaj:

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;
}

Przykład połączenia:

Color color=new Color(hexToInt("FFB74093"));
Rockvole
źródło
18

Prosta funkcja bez użycia klasy:

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

Możesz użyć tego w następujący sposób:

Color color1 = _colorFromHex("b74093");
Color color2 = _colorFromHex("#b74093");
Alvin Konda
źródło
1
Thansk do @ jeroen-meijer w celu edycji. W rzeczywistości możesz użyć tej jednej wkładki, jeśli masz ochotęColor(int.parse('#000000'.replaceAll('#', '0xff')))
Alvin Konda,
16

Łatwy sposób :

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

Stosowanie:

Container(
    color: Color(int.parse(color)),
)
Serdar Polat
źródło
14

Jest inne rozwiązanie. Jeśli przechowujesz kolor jako normalny ciąg szesnastkowy i nie chcesz do niego dodawać krycia (wiodące FF): 1) Konwertuj ciąg szesnastkowy na int Aby przekonwertować ciąg szesnastkowy na liczbę całkowitą, wykonaj jedną z następujących czynności:

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

lub

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

jako prefiks 0x (lub -0x) ustawi int. parse domyślnie na radix 16.

2) Dodaj krycie do koloru za pomocą kodu

Color color = new Color(myInt).withOpacity(1.0);
Evgeny Kot
źródło
1
Potrzebowałem „wiodącego FF” dla Fluttera ThemeData.
creativecreatorormaybenot,
Podoba mi się to rozwiązanie ze względu na jego prostotę, ale jak wspomniano w @creativecreatorormaybenot, wiodący FF jest nadal wymagany.
KevinM,
7

W Flutter tworzy kolor z RGB za pomocą alfa, użyj

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

Jak używać koloru szesnastkowego:

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

Kolor szesnastkowy z kryciem:

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

// lub zmień wartość „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

Aby uzyskać więcej, odwiedź oficjalny link https://api.flutter.dev/flutter/dart-ui/Color-class.html

Amit Prajapati
źródło
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));
}

przykładowe użycie

Text(
  'hello world',
  style: TextStyle(
    color: getColorFromHex('#aabbcc'),
    fontWeight: FontWeight.bold,
  )
)
Michael P. Bazos
źródło
5

W celach informacyjnych. Istnieje prostszy sposób korzystania z biblioteki Supercharged . Chociaż możesz używać metod rozszerzenia ze wszystkimi wymienionymi rozwiązaniami, znajdziesz praktyczny zestaw narzędzi biblioteki użytkownika.

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

Łatwiej, prawda?

Doładowany

Gauris Javier
źródło
4

"#b74093"? DOBRZE...

Do przepisu 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;
}
Nahuel Alejandro Cabrera
źródło
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));
}

Zaimportuj nową klasę i użyj jej w ten sposób HexToColor('#F2A03D')

watchdog0x
źródło
3

Brakowało mi oczywistej odpowiedzi przy użyciu liczb szesnastkowych dla konstruktora fromRGB:

Color.fromRGBO(0xb7, 0x40, 0x93, 1),
Adam
źródło
1

Możesz kliknąć opcję Widżet kolorów, który poda znacznie głębsze informacje o znaczeniu tych liter. Możesz także użyć metody Color.fromARGB (), aby stworzyć niestandardowe kolory, co jest dla mnie znacznie łatwiejsze. Skorzystaj z witryny Flutter Doctor Color Picker, aby wybrać dowolny kolor dla swojej aplikacji trzepotania.

EyoelD
źródło
0
String hexString = "45a3df";
Color(int.parse("0xff${hexString}"));

Nie wiem, dlaczego to jest powalane, to było dla mnie rozwiązanie.
Jedyny sposób, który nie wymagał dodatkowych kroków

Rio Weber
źródło
0

Możesz użyć tego pakietu from_css_color, aby wydostać Colorsię z ciągu szesnastkowego. Obsługuje trzy- i sześciocyfrowy zapis szesnastkowy RGB.

Color color = fromCSSColor('#ff00aa')

W celu optymalizacji utwórz instancję Color jeden raz dla każdego koloru i zapisz ją gdzieś do późniejszego wykorzystania.

Alex Myznikov
źródło