Dart中向dynamic变量添加Map报错原因及正确实现
Dart中dynamic变量赋值Map引发_TypeError的原因分析
触发错误的代码
void main() { dynamic a = {'a' : 'a', 'b' : 'b', 'c':'c'}; a['d'] = {'dd':'dd'}; }
报错信息
DartPad caught unhandled _TypeError: TypeError: Instance of 'IdentityMap<String, String>': type 'IdentityMap<String, String>' is not a subtype of type 'String' 4484:11 Object.throw_ 15812:15 Object._failedAsCheck 15798:14 dart_rti.Rti.new._generalAsCheckImplementation 30307:63 _js_helper.IdentityMap.from._set 4722:16 Object._checkAndCall 4774:17 Object.callMethod 4777:17 Object.dsend blob:null/bf8ecf44-b93c-4548-ac5e-c180547a1b46 224:10 main$0 blob:null/bf8ecf44-b93c-4548-ac5e-c180547a1b46 259:18 <fn> 43377:14 _rootRun 42207:14 async._CustomZone.new.run 43521:92 Object._runZoned 43481:18 Object.runZoned blob:null/bf8ecf44-b93c-4548-ac5e-c180547a1b46 257:20 Chain.capture Stack trace truncated and adjusted by DartPad...
可正常执行的修改后代码
void main() { dynamic a = {'a' : {'aa' : 'aa'}, 'b' : 'b', 'c':'c'}; a['d'] = {'dd':'dd'}; }
原因解析
当用dynamic声明的变量初始化为值全是String类型的Map时,Dart的类型推断会自动把这个Map识别为IdentityMap<String, String>类型——也就是键值全为String的Map。这时候往里面添加Map类型的value,就会因为类型不匹配触发_TypeError错误。
如果初始化的Map里本身就包含Map类型的value,Dart的类型推断会将Map的value类型推断为dynamic,后续自然可以正常添加Map类型的value。
内容的提问来源于stack exchange,提问作者hodov
相关产品推荐
相关产品推荐

