You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:32:47