【问题标题】:如何在 Flutter 中使用十六进制颜色字符串?
【发布时间】:2026-02-24 08:45:01
【问题描述】:

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

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

【问题讨论】:

  • 在谷歌浏览器开发工具中,您可以快速获取十六进制颜色的十进制数;只需单击样式侧栏中的小颜色矩形;在弹出窗口中,您可以通过单击 V 形在 HSLA、RGBA、HEX 之间切换表示。然后你可以使用Color.fromRGBO()

标签: flutter dart colors hex


【解决方案1】:

在 Flutter 中,Color class 只接受 整数 作为参数,或者有可能使用命名构造函数 fromARGBfromRGBO

所以我们只需要将字符串#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
  • @ŁukaszWiśniewski 是的,你可以;)你不能使用扩展的类来调用它们(HexColor.fromHex 有效,但 Color.fromHex 无效)。
  • 我很惊讶您可以将 0xFF 作为 int 的一部分传递
  • @HamishJohnson 0x 只是表示后面的数字会被解析为十六进制?
  • 有没有办法使用这些颜色的 50% 或任何 %?像颜色(0xFF183451)[50]?
【解决方案2】:

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

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 &lt;&lt; (4 * (len - 1 - i)))重复了三遍。
【解决方案3】:

"#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】:

还有另一种解决方案。如果您将颜色存储为普通的十六进制字符串并且不想为其添加不透明度(前导“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);
    

【讨论】:

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

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。
  • HexColor 类对我来说不适用于 MaterialColor,它一直在抱怨第二个参数。请在这里帮忙
  • .toUpperCase() 给出错误。删除它并立即工作
  • 完美解决方案:)
【解决方案6】:
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')

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

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

      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

      【讨论】:

        【解决方案9】:

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

        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'))),你也可以使用这一衬里
        • 那一个班轮是完美的! XD
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

          简单的方法:

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

          用法:

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

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

              如果你想使用#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 值更改为下表中的相应值。

              十六进制不透明度值

              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 谢谢其实我找到了一种方法。 *.com/questions/65856982/…
              【解决方案14】:

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

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

              更简单,对吧?

              Supercharged

              【讨论】:

                【解决方案15】:

                这是我的解决方案:

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

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

                【讨论】:

                • 您的解决方案对我有用。有什么缺点吗?
                • 不错的一个!工作过
                • 或者Color(int.parse(hexString.replaceFirst('#', '0xff'))),如果我确定输入的十六进制字符串是#RRGGBB格式(例如#45a3df)。
                【解决方案16】:

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

                Color color = fromCSSColor('#ff00aa')
                

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

                【讨论】:

                  【解决方案17】:

                  使用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")),
                          ),
                      ),
                  ),
                  

                  【讨论】:

                    【解决方案18】:

                    在你的文件中添加这个函数 -

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

                    【讨论】:

                    • 这是完美的答案!非常感谢。
                    【解决方案19】:

                    你可以用这个

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

                    【讨论】:

                    • 非常感谢。你救了我 5 个小时的头痛
                    • 感谢您的反馈。
                    【解决方案20】:

                    不幸的是,Flutter 中的 Color 类构造函数不接受简单的十六进制 字符串(如 CSS 中的 #bfeb91)。

                    相反,它需要一个整数,例如0xFFBFEB91

                    所以这里我们将十六进制字符串转换为整数。

                    一个简单的函数

                    给这个函数一个十六进制字符串,它会返回一个颜色!

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

                    这样使用

                    Text(
                      'Hello, World!',
                      style: TextStyle(backgroundColor: _getColorFromHex('ff00aa')), // Or 'bfeb91', or 'ffbfeb91'
                    ),
                    

                    作为字符串扩展

                    利用 Dart 扩展的强大功能,我们可以使用返回 Color 的函数来扩充 String

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

                    像这样使用它:

                    Text(
                      'Hello, World!',
                      style: TextStyle(backgroundColor: '#bfeb91'.toColor()), // Or 'bfeb91', or 'ffbfeb91'
                    ),
                    

                    【讨论】:

                      【解决方案21】:

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

                      0XFFBCE6EB

                      那么假设您要通过以下方式实现它:

                      backgroundColor: Color(0xffbce6eb)

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

                      【讨论】:

                        【解决方案22】:

                        由于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 开发者。 p>

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

                        import 'package:supercharged/supercharged.dart';
                        

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

                        代码:

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

                        您也可以使用 hexcolor 包,这也很棒。

                        【讨论】:

                          【解决方案23】:

                          如果您在应用程序中迫切需要十六进制颜色,您可以按照以下简单步骤操作:

                          1. 只需从here 将您的十六进制颜色转换为 RGB 格式。

                          2. 获取您的 RGB 值。

                          3. 在 Flutter 中,您有一个使用 RGB 颜色的简单选项:

                            Color.fromRGBO(r_value, g_value, b_value, opacity) 将为您完成这项工作。

                          4. 继续调整 O_value 以获得您想要的颜色。

                          【讨论】:

                            【解决方案24】:

                            不需要使用函数。

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

                            Container
                            (
                                color:Color(0xff000000)
                            )
                            

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

                            【讨论】:

                              【解决方案25】:

                              如何在 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

                              【讨论】:

                                【解决方案26】:

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

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

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

                                享受代码并帮助他人:)

                                【讨论】:

                                  【解决方案27】:

                                  我已经创建了这个 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... 
                                  

                                  【讨论】:

                                    【解决方案28】:

                                    // 调用此行设置颜色
                                    颜色: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));
                                    }
                                    

                                    【讨论】:

                                      【解决方案29】:

                                      我正在使用这个 material_color_gen 包,它的工作原理就像一个魅力

                                      material_color_gen: ^2.0.0
                                      

                                      使用:

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

                                      这是一个 HexColor 示例:#ff0000 更改 # 与 0xFF 结果为:0xFFFF0000

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

                                      【讨论】:

                                        【解决方案30】:

                                        最好的方法是使用来自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.

                                        【讨论】:

                                          最近更新 更多