ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Flutter 中使用十六进制颜色字符串?

如何在 Flutter 中将 十六进制颜色字符串(如 #b74093)转换为 Color

我想在 Dart 中使用 HEX 颜色代码。

在 google chrome devtools 中,您可以快速获取十六进制颜色的十进制数;只需单击样式侧边栏中的小颜色矩形;在弹出窗口中,您可以通过单击 V 形在 HSLA、RGBA、HEX 之间切换表示。然后您可以使用 Color.fromRGBO()

Y
Yeasin Sheikh

在 Flutter 中,Color class 只接受 整数 作为参数,或者有可能使用命名构造函数 fromARGB 和 {3 }。

所以我们只需要将字符串 #b74093 转换为整数值。此外,我们需要注意始终需要指定 opacity
255(完全)不透明度由十六进制值 FF 表示。这已经给我们留下了 0xFF。现在,我们只需要像这样附加我们的颜色字符串:

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

字母可以选择是否大写:

const color = const Color(0xFFB74093);

如果您想使用不透明度百分比值,可以将第一个 FF 替换为 this table 中的值(也适用于其他颜色通道)。

扩展类

Starting with Dart 2.6.0, you can create an extension 用于 Color 类,可让您使用十六进制颜色字符串来创建 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 方法也可以在 mixinclass 中声明,因为需要显式指定 HexColor 名称才能使用它,但扩展对于 toHex 方法很有用,它可以是隐式使用。这是一个例子:

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

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

使用十六进制字符串的缺点

这里的许多其他答案显示了如何从十六进制字符串动态创建 Color,就像我在上面所做的那样。但是,这样做意味着颜色不能是 const
理想情况下,您可以按照我在本答案第一部分中解释的方式分配颜色,这在大量实例化颜色时效率更高,这通常是Flutter 小部件的案例。


dart 中还不能有静态方法扩展github.com/dart-lang/language/issues/723
我很惊讶您可以将 0xFF 作为 int 的一部分传递
@HamishJohnson 0x 只是表示以下数字将被解析为十六进制🙃
有没有办法使用这些颜色的 50% 或任何 %?像颜色(0xFF183451)[50]?
@Ankit 您可以使用 this table 并将 Color 对象的前导 0xFF 中的 FF 替换为您需要的值。因此,在您的情况下,这将是 Color(0x80183451)
P
Peter Mortensen

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

这真的很棒!也适用于线性渐变。
HexColor 类对我来说不适用于 MaterialColor,它一直在抱怨第二个参数。请在这里帮忙
.toUpperCase() 给出错误。删除它并现在工作
Z
Zakria Khan

如果您想使用格式为#123456 的颜色的十六进制代码,那么很容易做到。创建一个 Color 类型的变量并为其分配以下值。

Color myHexColor = Color(0xff123456)

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

使用 myHexColor,您就可以开始了。

如果要直接从十六进制代码更改颜色的不透明度,请将 0xff 中的 ff 值更改为下表中的相应值。 (或者你可以使用

myHexColor.withOpacity(0.2)

这是更简单的方法。 0.2 是平均 20% 的不透明度)

十六进制不透明度值

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

保存这个参考是个好主意,尽管 .withOpacity(0.2) 在大多数情况下都足够有用。
这是格栅,但有时它会显示小部件下方的内容,例如当 SliverAppBar 滚动时,它会显示该小部件下方的内容,因为我正在降低不透明度。无论如何在不降低不透明度的情况下褪色。
@nipunravisara 获取颜色的十六进制并使用 100% 不透明度
@ZakriaKhan 谢谢实际上我找到了一种方法。 stackoverflow.com/questions/65856982/…
P
Peter Mortensen

如何在 Flutter 中使用十六进制颜色代码 #B74093

只需从十六进制颜色代码中删除 # 符号,并在 Color 类中添加带有颜色代码的 0xFF:

#b74093 在 Flutter 中将变为 Color(0xffb74093)

#B74093 在 Flutter 中将变为 Color(0xFFB74093)

Color(0xFFB74093) 中的 ff or FF 定义不透明度。

Hexadecimal colors example with all opacity types in Dartpad

https://i.stack.imgur.com/eWgn3.png


P
Peter Mortensen

简单的方法:

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

用法:

Container(
    color: Color(int.parse(color)),
)

P
Peter Mortensen

要将十六进制字符串转换为整数,请执行以下操作:

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

很多神奇的数字。这种语言/环境不支持命名常量吗?
(1 << (4 * (len - 1 - i))) 重复 3 次。
j
jeroen-meijer

一个不使用类的简单函数:

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

你可以像这样使用它:

Color color1 = _colorFromHex("b74093");
Color color2 = _colorFromHex("#b74093");

感谢@jeroen-meijer 进行编辑。事实上,如果你觉得很花哨,你也可以使用这一种衬里Color(int.parse('#000000'.replaceAll('#', '0xff')))
P
Peter Mortensen

还有另一种解决方案。如果您将颜色存储为普通的十六进制字符串并且不想为其添加不透明度(前导“FF”):

将十六进制字符串转换为 int 要将十六进制字符串转换为整数,请执行以下操作之一: var myInt = int.parse(hexString, radix: 16);或 var myInt = int.parse("0x$hexString");作为 0x (或 -0x)的前缀将使 int.parse 默认为 16 的基数。通过代码为您的颜色添加不透明度 Color color = new Color(myInt).withOpacity(1.0);


我需要 Flutter 的 ThemeData 的“领先 FF”。
我喜欢这种简单的解决方案,但正如@creativecreatorormaybenot 提到的那样,仍然需要领先的FF。
K
Kamlesh

感谢您提出这个问题,简单的解决方案如下:

// 颜色转十六进制字符串

colorToHexString(Color color) {
  return '#FF${color.value.toRadixString(16).substring(2, 8)}';
}

// 十六进制字符串到颜色

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

// 如何调用函数

String hexCode = colorToHexString(Colors.green);
Color bgColor = hexStringToColor(hexCode);
print("$hexCode = $bgColor");

享受代码并帮助他人:)


P
Peter Mortensen

这是我的解决方案:

String hexString = "45a3df";
Color(int.parse("0xff${hexString}"));

这是唯一不需要额外步骤的方法。


你的解决方案对我有用。有什么缺点吗,有人吗?
Color(int.parse(hexString.replaceFirst('#', '0xff'))),如果我确定输入的十六进制字符串是 #RRGGBB 格式(例如 #45a3df)。
P
Peter Mortensen

使用 hexcolor 将十六进制颜色引入 Dart hexcolorPlugin:

hexcolor: ^2.0.3

示例使用

import 'package:hexcolor/hexcolor.dart';
Container(
    decoration: new BoxDecoration(
        color: Hexcolor('#34cc89'),
    ),
    child: Center(
        child: Text(
            'Running on: $_platformVersion\n',
            style: TextStyle(color: Hexcolor("#f2f2f2")),
        ),
    ),
),

D
David Buck

你可以用这个

Color getColorFromColorCode(String code){
  return Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000);
}

P
Peter Mortensen

在 Flutter 中,要使用 alpha 从 RGB 创建颜色,请使用:

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

如何使用十六进制颜色:

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

具有不透明度的十六进制颜色:

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

有关更多信息,请参阅官方文档页面 Color class - dart:ui library - Dart API


P
Peter Mortensen

文件 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,
  )
)

K
Kamlesh

没有任何需要使用函数。

例如,使用颜色代码为容器赋予颜色:

Container
(
    color:Color(0xff000000)
)

这里的 0xff 是后跟颜色代码的格式


r
robben

在您的文件中添加此功能 -


Color parseColor(String color) {
  String hex = color.replaceAll("#", "");
  if (hex.isEmpty) hex = "ffffff";
  if (hex.length == 3) {
    hex = '${hex.substring(0, 1)}${hex.substring(0, 1)}${hex.substring(1, 2)}${hex.substring(1, 2)}${hex.substring(2, 3)}${hex.substring(2, 3)}';
  }
  Color col = Color(int.parse(hex, radix: 16)).withOpacity(1.0);
  return col;
}

并像使用它一样 -

Container(
    color: parseColor("#b74093")
)

P
Peter Mortensen

最简单的方法是将其转换为整数。例如,#BCE6EB。您将添加 0xFF,然后您将删除它的主题标签:

0XFFBCE6EB

然后假设您要通过以下方式实现它:

backgroundColor: Color(0xffbce6eb)

如果您只能使用十六进制,那么我建议使用 Hexcolor 包。


P
Peter Mortensen

供一般参考。使用 Supercharged 库有一种更简单的方法。尽管您可以将扩展方法与提到的所有解决方案一起使用,但您会找到实用的用户库工具包。

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

更容易,对吧?

Supercharged


C
Community

"#b74093"?好的...

十六进制配方

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

很多神奇的数字。这种语言/环境不支持命名常量吗?
老实说,这是一个糟糕的答案和糟糕的编码,这么多神奇的数字,一个班轮的代码太多
P
Peter Mortensen

由于 Color 构造函数不支持十六进制字符串,所以我们应该寻找其他替代方案。

有几种可能性:

1- 第一个是创建一个小函数,允许您将颜色十六进制字符串转换为颜色对象。

代码:

   Color colorFromHex(String hexColor) {
   final hexCode = hexColor.replaceAll('#', '');
   if (hexColor.length == 6) {
    hexColor = 'FF' + hexColor; // FF as the opacity value if you don't add it.
   }
  return Color(int.parse('FF$hexCode', radix: 16));
}

用法:

 Container(
          color: colorFromHex('abcdff'),
          child: Text(
            'Never stop learning',
            style: TextStyle(color: colorFromHex('bbffffcc')),
          ),
        )

2- 第二种可能性是使用 supercharged 包。 Supercharged 将 Kotlin 等语言的所有舒适功能带给所有 Flutter 开发人员。

将依赖项 supercharged: ^1.X.X(查找最新版本)添加到您的项目并开始在任何地方使用 Supercharged:

import 'package:supercharged/supercharged.dart';

现在,将任何字符串转换为颜色

代码 :

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

您还可以使用同样很棒的 hexcolor 包。


A
Adam

在 fromRGB 构造函数中使用十六进制数:

Color.fromRGBO(0xb7, 0x40, 0x93, 1),

V
Volodymyr

基于@Serdar 回答https://stackoverflow.com/a/57943307/4899849的简单扩展

extension HexString on String {
  int getHexValue() => int.parse(replaceAll('#', '0xff'));
}

用法:

'#b74093'.getHexValue()

P
Peter Mortensen
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')

P
Peter Mortensen

您可以单击颜色小部件,它会以更深入的信息告诉您这些字母代表什么。

您还可以使用 Color.fromARGB() 方法来创建自定义颜色,这对我来说更容易。使用 Flutter Doctor Color Picker 网站为您的 Flutter 应用程序选择您想要的任何颜色。


a
abhi

我已经创建了这个 String 类的 Flutter 扩展函数。如果你也讨厌 0xFFF,这有点有用😎

extension on String {
  Color parse() {
    var hexColor = this.replaceAll("#", "");
    if (hexColor.length == 6) {
      hexColor = "FF" + hexColor;
    }
    if (hexColor.length == 8) {
      return Color(int.parse("0x$hexColor"));
    }
  }
}

您可以使用任何十六进制颜色代码字符串,如下所示...

'#bdbdbd'.parse() // this will return Color class object which you use in widget... 

P
Peter Mortensen

您可以使用包 from_css_color 从十六进制字符串中获取 Color。它支持三位和六位 RGB 十六进制表示法。

Color color = fromCSSColor('#ff00aa')

为了优化起见,为每种颜色创建一次 Color 实例并将其存储在某个地方以供以后使用。


M
MNBWorld

最好的方法是使用 pub.dev 中的 flutter hex color 插件并导入包。

import 'package:hexcolor/hexcolor.dart';

然后以这种特殊的方式使用它。

Text( 
     'Running on: $_platformVersion\n',
      style: TextStyle(color: HexColor("#f2f2f2")),
    ),
Text(
      "Hex From Material  $textColor",
       style: TextStyle(color: ColorToHex(Colors.teal)),
    ),

特定插件 here


P
Peter Mortensen

如果您在应用程序中迫切需要十六进制颜色,您可以遵循一个简单的步骤:

只需从这里将您的十六进制颜色转换为 RGB 格式。获取您的 RGB 值。在 Flutter 中,您有一个使用 RGB 颜色的简单选项: Color.fromRGBO(r_value, g_value, b_value, opacity) 将为您完成这项工作。继续调整 O_value 以获得您想要的颜色。


s
sarjeet singh

// 调用此行设置颜色颜色:HexColor(HexColor.Primarycolor)

我创建了一个类 HexColor 并污染了这个类中的所有颜色。这是 100% 的工作代码

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

 static var Primarycolor="FF3E3F";

  static var Accentcolor="b74093";

  static var white="b74093";

static var black="b74093";

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

R
Rachid Loukili

我正在使用这个 material_color_gen 包它就像一个魅力

material_color_gen: ^2.0.0

使用 :

import 'package:material_color_gen/material_color_gen.dart';
primarySwatch: Color(0xFFFF0000).toMaterialColor()

这是一个 HexColor 示例:#ff0000 Change # with 0xFF result is: 0xFFFF0000

官方链接:https://pub.dev/packages/material_color_gen