如何处理强模式分析的隐式投射警告?

时间:2016-03-23 10:34:24

标签: dart

我在Web应用程序中常见的事情是从服务器请求资源并将其作为dart中的Map处理。

import 'dart:convert';

const String sampleJSON = '''
{
    "member": {
        "meaningOfLife": 42
    }
}
''';

Map<String, dynamic> getResource() {
  // do some magic
  return JSON.decode(sampleJSON);
}

我认为JSON解码Map中的所有键都是字符串,但显然我不知道值的类型。在检查模式下,这相当不错。

在强模式下对上述代码进行分析会告诉我:Unsound implicit cast from dynamic to Map<String, dynamic>

问题:

处理此类投射警告的好策略是什么?

可疑选项1:

Map getResource() {
  // do some magic
  return JSON.decode(sampleJSON);
}

稍后这可能是一个问题:Iterable<String> keys = getResource().keys会发出警告。

可疑选项2:

Map<String, dynamic> getResource() {
  // do some magic
  return new Map<String, dynamic>.from(JSON.decode(sampleJSON));
}

它不会降低性能吗?我仍然会收到Map<String, dynamic> meaning = getResource()["member"];

的警告

感谢您的建议。

1 个答案:

答案 0 :(得分:5)

如果您知道该类型,那么只需明确

return JSON.decode(sampleJSON) as Map<String,dynamic>;

Flutter团队禁止使用as,因为它引入了运行时检查并且具有性能影响。如果相关,则取决于您的要求。

或者,您可以将警告静音(可能在您的Dart版本中无效)

// ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
return JSON.decode(sampleJSON);

另见Suppress hint about use of protected member