代码如下:
static const _defaults = <String, dynamic>{
'api_key': '4839234792374',
'enabled': false,
'concurrency': 4,
};
String getString(String key) {
return _remoteConfig == null ?
_defaults.containsKey(key) && _defaults[key] :
_remoteConfig.getString(key);
}
这个错误很明显(我很惭愧,是由类似 getBool(key)
函数的盲目复制粘贴产生的。如果 _remoteConfig
是 null
,执行会命中 {{1 }} 路径,我得到运行时异常 bool && String
。完全合法,但为什么分析器没有看到它?执行流程非常清晰,一条路径返回 type 'String' is not a subtype of type 'bool'
另一条路径(理论上)返回 {{1 }} 并且返回类型是String
,这意味着所有路径都返回dynamic
。
我不明白什么?
飞镖 2.12.0 迂腐1.11.0
分析器选项:
String
答案 0 :(得分:1)
我认为您在问两个问题:
为什么分析器不抱怨 _defaults.containsKey(key) && _defaults[key]
?
为什么分析器不抱怨沿其两条路径具有不同类型的三元表达式?
对于 #1:由于 _defaults[key]
返回类型 dynamic
(在运行时可能是 bool
),我不希望分析投诉。
对于#2:由于两条路径具有不同的类型,三元表达式的类型是公共基类型:Object
。如果启用了隐式转换,则 Object
将自动转换为 String
返回类型。
如果您在 analysis_options.yaml
配置文件中disable implicit casts,分析器确实会捕获这两个错误:
analyzer:
strong-mode:
implicit-casts: false
运行分析器然后打印:
<块引用>错误 • 运算符 '&&' 的操作数必须可分配给 'bool' at ... • (non_bool_operand)
<块引用>错误 • 无法从函数“getString”返回“Object”类型的值,因为它在...处具有“String”的返回类型 • (return_of_invalid_type)
(我很惊讶 implicit-casts: false
会触发带有 &&
操作数的 dynamic
表达式的分析错误;也许我的理解不是很准确,或者这是一个错误在分析器中。)