我正在使用HydratedBloc尝试将颜色存储为int作为int值,所以我没有大量的if / else方法来执行一堆if (color == Colors.blue) => 'blue'
等...
所以我正在尝试:
int mapColorToInt(Color color) => color.value;
Color mapIntToColor(int colorValue) => Color(colorValue);
@override
ThemeState fromJson(Map<String, dynamic> json) {
return NewTheme(
themeData: ThemeData(
scaffoldBackgroundColor: mapIntToColor(json['scaffoldBackgroundColor']),
accentColor: mapIntToColor(json['accentColor']),
),
);
}
@override
Map<String, dynamic> toJson(ThemeState state) {
return {
'scaffoldBackgroundColor':
mapColorToInt(state.themeData.scaffoldBackgroundColor),
'accentColor': mapColorToInt(state.themeData.accentColor),
};
}
并得到此错误:
未处理的错误未处理的错误类型'String'不是'ThemeBloc'实例中发生的'int'类型的子类型。
我不明白整数是否是受支持的类型,但是根据我的搜索,看来我并不是唯一遇到整数和json问题的人。
所以我然后尝试做同样的事情,但保留所有字符串:
String mapColorToInt(Color color) => color.value.toString();
Color mapIntToColor(String colorValue) => Color(int.parse(colorValue));
@override
ThemeState fromJson(Map<String, dynamic> json) {
return NewTheme(
themeData: ThemeData(
scaffoldBackgroundColor: mapIntToColor(json['scaffoldBackgroundColor']),
accentColor: mapIntToColor(json['accentColor']),
),
);
}
@override
Map<String, dynamic> toJson(ThemeState state) {
return {
'scaffoldBackgroundColor':
mapColorToInt(state.themeData.scaffoldBackgroundColor),
'accentColor': mapColorToInt(state.themeData.accentColor),
};
}
这会导致此错误:
未处理的错误未处理的错误FormatException:无效的基数10(在字符1处)
很明显,我在这里遗漏了一些东西,但不清楚。我在UI中测试了mapIntToColor函数,并且在传递color.value
时可以正常工作。任何帮助将不胜感激。
谢谢。
答案 0 :(得分:0)
请让我知道json ['accentColor']的示例。
如果该json值类似于“ #FCFDSD”,请尝试使用以下代码。
scaffoldBackgroundColor: HexColor(json['scaffoldBackgroundColor']),
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));
}