以下是代码:
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
,则执行命中bool && String
路径,我得到运行时异常type 'String' is not a subtype of type 'bool'
。完全合法,但为什么分析器没有看到它?执行流非常清楚,一个路径返回String
,另一个路径(理论上(返回dynamic
,返回类型为String
这意味着所有路径返回CCD_ 9。我不明白的是什么?
飞镖2.12.0迂腐的1.11.0
分析仪选项:
include: package:pedantic/analysis_options.yaml
analyzer:
exclude:
- lib/generated/*
- lib/**/*.g.dar
我想你在问两个问题:
-
为什么分析仪不抱怨
_defaults.containsKey(key) && _defaults[key]
? -
为什么分析器不抱怨沿着其两条路径具有不同类型的三元表达式?
对于#1:由于_defaults[key]
返回类型dynamic
(在运行时可能是bool
(,我不希望出现分析投诉。
对于#2:由于两个路径具有不同的类型,三元表达式的类型是常见的基类型:Object
。如果启用了隐式强制转换,则Object
将自动强制转换为String
返回类型。
如果在analysis_options.yaml
配置文件中禁用隐式强制转换,分析器会捕获这两个错误
analyzer:
strong-mode:
implicit-casts: false
运行分析仪,然后打印:
error•运算符"&;'必须可在…处分配给"bool"。•(non_bool_operand(
error•无法从函数"getString"返回"Object"类型的值,因为它在…处的返回类型为"String"。•(return_of_invalid_type(
(我很惊讶implicit-casts: false
用dynamic
操作数触发了&&
表达式的分析错误;也许我的理解不太准确,也许这是分析器中的一个错误。(