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

Posted

技术标签:

【中文标题】Flutter fromJson - 未处理的错误未处理的错误类型\'String\'不是\'int\'类型的子类型发生在实例中【英文标题】:Flutter fromJson - Unhandled error Unhandled error type 'String' is not a subtype of type 'int' occurred in Instance ofFlutter fromJson - 未处理的错误未处理的错误类型'String'不是'int'类型的子类型发生在实例中 【发布时间】:2021-01-26 08:21:09 【问题描述】:

我正在使用 HydratedBloc 尝试将颜色存储为 json 作为 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),
    ;
  

并得到这个错误:

未处理的错误在“ThemeBloc”的实例中发生未处理的错误类型“String”不是“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: Invalid radix-10 number (at character 1)

显然我在这里遗漏了一些东西,但不清楚是什么。我在 UI 中测试了 mapIntToColor 函数,它在通过 color.value 时工作正常。任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

请告诉我 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));

【讨论】:

嗨库库,感谢您的回复。颜色上的 .value 与十六进制值不同,但我仍然使用十六进制值尝试了您的代码,不幸的是得到了无效的基数错误。 让我知道你的json的颜色值? 好的,如果我将 Colors.blue 传递给我的 mapColorToInt 函数,它会返回 4280391411。根据文档,value 属性是代表颜色的 32 位值。 你会打印'state.themeData.scaffoldBackgroundColor'值和'state.themeData.accentColor'吗? state.themeData.scaffoldBackgroundColor' 打印:MaterialColor(primary value: Color(0xff2196f3))

以上是关于Flutter fromJson - 未处理的错误未处理的错误类型'String'不是'int'类型的子类型发生在实例中的主要内容,如果未能解决你的问题,请参考以下文章

Flutter JSON 该类没有名为“fromJson”的构造函数

Gson.fromJson没有处理错误的响应

Flutter:未处理的异常:错误状态:DocumentSnapshotPlatform中不存在字段

Flutter firebase 查询快照错误:“未处理的异常:错误状态:无元素”

Flutter Web:在 Flutter 运行时在注入的 client.js 脚本中检测到未处理的错误

Flutter 中的错误:未处理的异常:“Null”类型不是“String”类型的子类型