Flutter fromJson-未处理的错误未处理的错误类型'String'不是类型'int'的子类型,发生在

时间:2020-10-12 02:01:31

标签: json flutter bloc

我正在使用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时可以正常工作。任何帮助将不胜感激。

谢谢。

1 个答案:

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