ฉันจะใช้สตริงสีฐานสิบหกใน Flutter ได้อย่างไร


คำตอบ:


358

ในกระพือColorระดับยอมรับเฉพาะจำนวนเต็มเป็นพารามิเตอร์หรือมีความเป็นไปได้ที่จะใช้ก่อสร้างชื่อและfromARGBfromRGBO

ดังนั้นเราต้องแปลงสตริง#b74093เป็นค่าจำนวนเต็มเท่านั้น นอกจากนี้เราต้องเคารพความทึบที่ต้องระบุเสมอ
255(เต็ม) FFความทึบแสงเป็นตัวแทนจากค่าฐานสิบหก 0xFFอย่างนี้แล้วทำให้เรามี ตอนนี้เราแค่ต้องต่อท้ายสตริงสีของเราดังนี้:

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

ตัวอักษรสามารถเลือกเป็นตัวพิมพ์ใหญ่หรือไม่:

const color = const Color(0xFFB74093);

เริ่มต้นด้วยการปาเป้า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());
}

ข้อเสียของการใช้สตริง hex

คำตอบอื่น ๆ อีกมากมายที่นี่แสดงให้เห็นว่าคุณสามารถสร้างColorสตริงแบบ hex ได้แบบไดนามิกเช่นเดียวกับที่ฉันทำไว้ด้านบน อย่างไรก็ตามการทำเช่นนี้หมายความว่าสีไม่สามารถเป็นconstได้
เป็นการดีที่คุณจะกำหนดสีของคุณตามที่ฉันอธิบายไว้ในส่วนแรกของคำตอบนี้ซึ่งมีประสิทธิภาพมากขึ้นเมื่อสร้างอินสแตนซ์สีจำนวนมากซึ่งโดยปกติจะเป็นกรณีของวิดเจ็ต Flutter


คุณไม่สามารถมีส่วนขยายวิธีการคงที่ใน dart แต่github.com/dart-lang/language/issues/723
ŁukaszWiśniewski

1
@ ŁukaszWiśniewskiใช่คุณทำได้;) คุณไม่สามารถเรียกพวกเขาได้โดยใช้คลาสที่ขยายออกไป (ใช้HexColor.fromHexงานได้ แต่Color.fromHexไม่ได้)
creativecreatorormaybenot

ฉันแค่ประหลาดใจที่คุณสามารถส่ง 0xFF ในฐานะส่วนหนึ่งของ int
Hamish Johnson

@HamishJohnson 0xเพียงระบุว่าตัวเลขต่อไปนี้จะถูกแยกเป็นเลขฐานสิบหก🙃
creativecreatorormaybenot

138

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
xhinoda

คลาส HexColor ไม่สามารถใช้งานกับ MaterialColor ได้สำหรับฉันมันยังคงบ่นพารามิเตอร์ที่สอง โปรดช่วยที่นี่
leeCoder

22

หากคุณต้องการใช้รหัสสีฐานสิบหกซึ่งอยู่ในรูปแบบ # 123456 นี้จะถูกนำมาใช้อย่างง่ายดายสร้างตัวแปร A ประเภทสีและกำหนดค่าต่อไปนี้

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 .

ใช้ myhexcolor และคุณพร้อมที่จะไป

หากคุณต้องการเปลี่ยนความทึบของสีโดยตรงจากรหัสฐานสิบหกแล้วเปลี่ยนค่า ff ใน 0xff เป็นค่าตามลำดับจากตารางด้านล่าง

ค่าความทึบแสง Hex

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


1
เป็นความคิดที่ดีที่จะบันทึกการอ้างอิงนี้แม้ว่า. .Outacity (0.2) จะมีประโยชน์มากพอสำหรับฉันในทุกกรณี
Gauris Javier

19

ฟังก์ชั่นที่เรียบง่ายโดยไม่ต้องใช้คลาส:

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

คุณสามารถใช้สิ่งนี้:

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

2
Thansk ถึง @ jeroen-meijer สำหรับการแก้ไข ในความเป็นจริงคุณสามารถใช้สายการบินนี้ได้เช่นกันหากคุณรู้สึกว่าแฟนซีColor(int.parse('#000000'.replaceAll('#', '0xff')))
Alvin Konda

18

หากต้องการแปลงจากสตริงเลขฐานสิบหกเป็น int ให้ทำ:

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


14

มีวิธีแก้ไขปัญหาอื่น หากคุณเก็บสีของคุณเป็นสตริง hex ปกติและไม่ต้องการเพิ่มความทึบ (นำ FF): 1) แปลงสตริง hex ของคุณเป็น int หากต้องการแปลง hex-string เป็นจำนวนเต็มให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:

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

หรือ

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

เป็นคำนำหน้าของ 0x (หรือ -0x) จะทำให้ค่าเริ่มต้น int.parse เพื่อ radix จาก 16

2) เพิ่มความทึบแสงให้กับสีของคุณผ่านรหัส

Color color = new Color(myInt).withOpacity(1.0);

1
ผมจำเป็นต้องมี "FF ชั้นนำ" ThemeDataสำหรับกระพือของ
creativecreatorormaybenot

ฉันชอบโซลูชันนี้สำหรับความเรียบง่าย แต่ตามที่ @creativecreatorormaybenot ที่กล่าวถึง FF ชั้นนำยังคงต้องการ
KevinM

7

ใน Flutter มันสร้างสีจาก 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 hex-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

สำหรับการติดตามเพิ่มเติมอย่างเป็นทางการลิงค์https://api.flutter.dev/flutter/dart-ui/Color-class.html


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

ตัวอย่างการใช้งาน

Text(
  'hello world',
  style: TextStyle(
    color: getColorFromHex('#aabbcc'),
    fontWeight: FontWeight.bold,
  )
)

5

สำหรับการอ้างอิงทั่วไป มีวิธีที่ง่ายกว่าการใช้ห้องสมุดเป็นซูเปอร์ แม้ว่าคุณสามารถใช้วิธีการส่วนขยายกับโซลูชันทั้งหมดที่กล่าวถึงคุณพบชุดเครื่องมือไลบรารีผู้ใช้ที่ใช้งานได้จริง

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

ง่ายขึ้นใช่มั้ย

ซูเปอร์


4

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


3

ฉันพลาดคำตอบที่ชัดเจนโดยใช้เลขฐานสิบหกสำหรับ constructor fromRGB:

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

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

ไม่ทราบว่าทำไมสิ่งนี้ถึงหยุดลงนี่คือทางออกสำหรับฉัน
วิธีเดียวที่ไม่ต้องการขั้นตอนเพิ่มเติม


1

คุณสามารถคลิกที่ Widget สีและมันจะบอกคุณในข้อมูลที่ลึกซึ้งยิ่งขึ้นว่าตัวอักษรเหล่านั้นเป็นอย่างไร คุณยังสามารถใช้วิธี Color.fromARGB () เพื่อสร้างสีที่กำหนดเองซึ่งง่ายกว่าสำหรับฉันมาก ใช้เว็บไซต์Flutter Doctor Color Pickerเพื่อเลือกสีที่คุณต้องการสำหรับแอพพลิเคชั่นพลิ้วของคุณ


0

คุณสามารถใช้แพ็คเกจนี้จาก_css_colorเพื่อColorออกจากสตริงฐานสิบหก รองรับสัญกรณ์ฐานสิบหก RGB ทั้งสามและหกหลัก

Color color = fromCSSColor('#ff00aa')

เพื่อประโยชน์ในการปรับให้เหมาะสมสร้างอินสแตนซ์สีหนึ่งครั้งสำหรับแต่ละสีและเก็บไว้ที่ใดที่หนึ่งเพื่อใช้ในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.