Flutter中Color转String再转回Color失败,求解决方案
解决Flutter中Color与String互转失败的问题
这个问题我之前也踩过坑!你直接用as Color转换肯定行不通,因为Color.toString()返回的是类似Color(0xff443a49)这种人类可读的字符串,它和Color类型完全是两个不同的东西,as操作符只能用于兼容类型的转换(比如子类转父类),所以才会抛出type 'String' is not a subtype of type 'Color'的错误。
下面给你两种靠谱的解决办法,优先推荐第一种:
方法一:通过Color的value值(最稳定)
Color的核心本质是一个整数(比如0xff443a49就是一个十六进制整数),我们直接把这个整数转成字符串存起来,转回的时候再把字符串转成整数传入Color构造函数就行:
Color pickerColor = Color(0xff443a49); // 把Color的value(整数)转成字符串 String testingColorString = pickerColor.value.toString(); // 转回Color:先把字符串转成整数,再传入Color构造函数 Color newColor = Color(int.parse(testingColorString));
这种方法完全不依赖toString()的输出格式,就算Flutter以后修改了Color的toString实现,也不会影响你的代码,绝对是最可靠的方案。
方法二:解析toString()的输出(不推荐,依赖格式)
如果你一定要用toString()的结果来转换,那得从字符串里提取出里面的十六进制数字。比如Color(0xff443a49),我们可以用正则表达式把括号里的数字提取出来,再转成整数:
Color pickerColor = Color(0xff443a49); String testingColorString = pickerColor.toString(); // 用正则匹配Color(...)里的十六进制值 RegExp colorReg = RegExp(r'Color\((0x[0-9a-fA-F]+)\)'); Match? matchResult = colorReg.firstMatch(testingColorString); if (matchResult != null) { String colorHex = matchResult.group(1)!; int colorValue = int.parse(colorHex); Color newColor = Color(colorValue); }
不过这种方法有个隐患:如果Flutter官方修改了Color的toString输出格式(比如改成Color(rgb(68,58,73))),你的正则就失效了,所以除非特殊需求,不建议用这种方法。
内容的提问来源于stack exchange,提问作者Chrystian
相关产品推荐
相关产品推荐

