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

Dan*_* V. 3 dart

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

import 'dart:convert';

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

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

我假设JSON解码Map中的所有键都是字符串,但显然我不知道值的类型.在检查模式下,这工作得相当好.

以强模式分析上面的代码将告诉我: Unsound implicit cast from dynamic to Map<String, dynamic>

题:

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

可疑选项1:

Map getResource() {
  // do some magic
  return JSON.decode(sampleJSON);
}
Run Code Online (Sandbox Code Playgroud)

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

可疑选项2:

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

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

感谢您的建议.

Gün*_*uer 5

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

return JSON.decode(sampleJSON) as Map<String,dynamic>;
Run Code Online (Sandbox Code Playgroud)

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

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

// ignore: STRONG_MODE_DOWN_CAST_COMPOSITE
return JSON.decode(sampleJSON);
Run Code Online (Sandbox Code Playgroud)

另请参阅抑制有关使用受保护成员的提示