Flutter中十六进制颜色码字符串转int的方法及空值报错解决方案
问题核心原因
- 空指针触发:你编写的
_getColorFromHex未对传入的颜色码字符串做空校验,当Firebase返回的字段为null时,直接调用toUpperCase()方法就会抛出指定错误,和颜色码是否为纯数字无关,只是你恰好遇到了纯数字颜色码字段为空的场景。 - 缺失Alpha通道补全逻辑:Flutter的
Color构造需要32位ARGB格式的整型值,你原代码中长度为6位的颜色码分支为空,直接parse后会缺失高位的透明度信息,会导致颜色透明度异常甚至不可见。 - 输入格式兼容不足:未处理带
#前缀、长度不符合6/8位规范的异常输入,容易触发解析错误。
修复后的完整HexColor实现
class HexColor extends Color { // 默认色可根据需求调整,这里设为不透明浅灰色 static const int _defaultColor = 0xFFCCCCCC; static int _getColorFromHex(String? hexColor) { // 空值/空字符串直接返回默认色,避免空指针报错 if (hexColor == null || hexColor.isEmpty) return _defaultColor; // 统一移除#前缀、转大写,兼容任意输入大小写、带不带#的场景 String formattedHex = hexColor.toUpperCase().replaceAll("#", ""); // 补全Alpha通道 if (formattedHex.length == 6) { // 6位RGB码默认加FF前缀,代表完全不透明 formattedHex = "FF$formattedHex"; } else if (formattedHex.length != 8) { // 长度不符合6/8位规范直接返回默认色,避免解析报错 return _defaultColor; } // 合法格式直接转16进制整型 return int.parse(formattedHex, radix: 16); } HexColor(String? hexColor) : super(_getColorFromHex(hexColor)); }
调用方式
替换你原有的容器装饰代码即可,你提到的所有颜色码(a74556、827255、a3d57a、662482这类混合字母/纯数字的6位码都能正常解析):
decoration: BoxDecoration(color: HexColor(ItemList[index].ColorCode)),
补充说明
- 纯数字构成的6位颜色码本身是合法的16进制字符串,
int.parse(xxx, radix:16)可以直接解析,不需要额外拆分数字处理。 - 如需自定义默认色,修改
_defaultColor的常量值即可,格式为ARGB的16进制整型,比如0xFF000000代表不透明黑色。
内容的提问来源于stack exchange,提问作者dartKnightRises
相关产品推荐
相关产品推荐

