如何转换一个十六进制颜色字符串像#b74093
一个Color
在颤振?
我想在Dart中使用十六进制颜色代码。
在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
,你可以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
像上面我一样从十六进制字符串动态创建a 。但是,这样做意味着颜色不能为const
。
理想情况下,你将按照我在此答案第一部分中解释的方式分配颜色,这在实例化大量颜色时会更有效,通常对于Flutter小部件而言就是这种情况。
您尚未在dart中拥有静态方法扩展,但仍为github.com/dart-lang/language/issues/723
@ŁukaszWiśniewski是的,您可以;)您不能使用扩展的类来调用它们(
HexColor.fromHex
可以,但Color.fromHex
不能)。我很惊讶您可以将0xFF作为int的一部分传递
@HamishJohnson
0x
仅指示以下数字将被解析为十六进制imal