【发布时间】:2026-02-24 08:45:01
【问题描述】:
如何在 Flutter 中将 十六进制颜色字符串(如 #b74093)转换为 Color?
我想在 Dart 中使用 HEX 颜色代码。
【问题讨论】:
-
在谷歌浏览器开发工具中,您可以快速获取十六进制颜色的十进制数;只需单击样式侧栏中的小颜色矩形;在弹出窗口中,您可以通过单击 V 形在 HSLA、RGBA、HEX 之间切换表示。然后你可以使用
Color.fromRGBO()
如何在 Flutter 中将 十六进制颜色字符串(如 #b74093)转换为 Color?
我想在 Dart 中使用 HEX 颜色代码。
【问题讨论】:
Color.fromRGBO()
在 Flutter 中,Color class 只接受 整数 作为参数,或者有可能使用命名构造函数 fromARGB和fromRGBO。
所以我们只需要将字符串#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 方法也可以在 mixin 或 class 中声明,因为需要显式指定 HexColor 名称才能使用它,但扩展名对于 toHex 方法很有用,可以隐式使用。这是一个例子:
void main() {
final Color color = HexColor.fromHex('#aabbcc');
print(color.toHex());
print(const Color(0xffaabbcc).toHex());
}
这里的许多其他答案展示了如何从十六进制字符串动态创建Color,就像我在上面所做的那样。但是,这样做意味着颜色不能是const。
理想情况下,您可以按照我在本答案第一部分中解释的方式分配颜色,这在大量实例化颜色时效率更高,这通常是 Flutter 小部件的情况。
【讨论】:
HexColor.fromHex 有效,但 Color.fromHex 无效)。
0x 只是表示后面的数字会被解析为十六进制?
要将十六进制字符串转换为整数,请执行以下操作:
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)))重复了三遍。
"#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;
}
【讨论】:
还有另一种解决方案。如果您将颜色存储为普通的十六进制字符串并且不想为其添加不透明度(前导“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);
【讨论】:
ThemeData 的“领先 FF”。
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
【讨论】:
.toUpperCase() 给出错误。删除它并立即工作
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')
【讨论】:
您可以点击颜色小部件,它会告诉您更深入的信息,这些字母代表什么。
您还可以使用 Color.fromARGB() 方法来创建自定义颜色,这对我来说更容易。使用Flutter Doctor Color Picker 网站为您的 Flutter 应用程序选择您想要的任何颜色。
【讨论】:
在 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。
【讨论】:
一个不使用类的简单函数:
Color _colorFromHex(String hexColor) {
final hexCode = hexColor.replaceAll('#', '');
return Color(int.parse('FF$hexCode', radix: 16));
}
你可以这样使用它:
Color color1 = _colorFromHex("b74093");
Color color2 = _colorFromHex("#b74093");
【讨论】:
Color(int.parse('#000000'.replaceAll('#', '0xff'))),你也可以使用这一衬里
///
/// 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,
)
)
【讨论】:
简单的方法:
String color = yourHexColor.replaceAll('#', '0xff');
用法:
Container(
color: Color(int.parse(color)),
)
【讨论】:
在 fromRGB 构造函数中使用十六进制数:
Color.fromRGBO(0xb7, 0x40, 0x93, 1),
【讨论】:
如果你想使用#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
【讨论】:
SliverAppBar 滚动时,它会显示该小部件下方的内容,因为我正在降低不透明度。有没有办法在不降低不透明度的情况下淡化颜色。
供一般参考。使用 Supercharged 库有一种更简单的方法。虽然您可以使用所有提到的解决方案的扩展方法,但您会找到实用的用户库工具包。
"#ff00ff".toColor(); // Painless hex to color
"red".toColor(); // Supports all web color names
更简单,对吧?
【讨论】:
这是我的解决方案:
String hexString = "45a3df";
Color(int.parse("0xff${hexString}"));
这是唯一不需要额外步骤的方法。
【讨论】:
Color(int.parse(hexString.replaceFirst('#', '0xff'))),如果我确定输入的十六进制字符串是#RRGGBB格式(例如#45a3df)。
您可以使用包from_css_color 从十六进制字符串中获取Color。它同时支持三位和六位RGB十六进制表示法。
Color color = fromCSSColor('#ff00aa')
为优化起见,为每种颜色创建一次 Color 实例,并将其存储在某处以供以后使用。
【讨论】:
使用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")),
),
),
),
【讨论】:
在你的文件中添加这个函数 -
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")
)
【讨论】:
你可以用这个
Color getColorFromColorCode(String code){
return Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000);
}
【讨论】:
不幸的是,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'
),
【讨论】:
最简单的方法是将其转换为整数。例如,#BCE6EB。您将添加 0xFF,然后删除制作它的主题标签:
0XFFBCE6EB
那么假设您要通过以下方式实现它:
backgroundColor: Color(0xffbce6eb)
如果你只能使用十六进制,那么我建议使用Hexcolor 包。
【讨论】:
由于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 包,这也很棒。
【讨论】:
如果您在应用程序中迫切需要十六进制颜色,您可以按照以下简单步骤操作:
只需从here 将您的十六进制颜色转换为 RGB 格式。
获取您的 RGB 值。
在 Flutter 中,您有一个使用 RGB 颜色的简单选项:
Color.fromRGBO(r_value, g_value, b_value, opacity) 将为您完成这项工作。
继续调整 O_value 以获得您想要的颜色。
【讨论】:
不需要使用函数。
例如,使用颜色代码为容器赋予颜色:
Container
(
color:Color(0xff000000)
)
这里的 0xff 是格式后跟颜色代码
【讨论】:
如何在 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
【讨论】:
感谢您提出这个问题,简单的解决方案如下:
// 颜色转十六进制字符串
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");
享受代码并帮助他人:)
【讨论】:
我已经创建了这个 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...
【讨论】:
// 调用此行设置颜色
颜色: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));
}
【讨论】:
我正在使用这个 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
【讨论】: