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

Dart/Flutter创建Map键值对报错:'String'不是'List'子类型

问题原因

你声明的Map类型为<String, List<String>>,意味着所有键对应的值必须是List<String>类型,但你给'Name'键赋值的是字符串contact,违反了类型约束,因此抛出type 'String' is not a subtype of type 'List'异常。

解决方案

根据你的实际需求,有两种修正方式:

方式一:符合「联系人名为键、电话号码列表为值」的设计

如果你的目标是构建以联系人名字为键,对应电话号码列表为值的Map,直接将联系人名作为键、号码列表作为值存入即可:

void mapContacts() {
  String contactName = 'Test';
  List<String> phones = ['4160000000', '7780000000'];
  var contactsMap = <String, List<String>>{};
  contactsMap[contactName] = phones;

  print(contactsMap); // 输出: {Test: [4160000000, 7780000000]}
}

方式二:保留'Name'和'phones'作为键

如果你确实需要用'Name'和'phones'作为键存储不同类型的值,需要修改Map的类型声明,允许值为String或List<String>:

void mapContacts() {
  String contact = 'Test';
  List<String> phones = ['4160000000', '7780000000'];
  // 用Object作为值的类型,兼容String和List<String>
  var maps = <String, Object>{};
  maps['Name'] = contact;
  maps['phones'] = phones;

  print(maps); // 输出: {Name: Test, phones: [4160000000, 7780000000]}
}

更规范的写法:自定义类

对于这种结构化数据,推荐使用自定义类来约束结构,避免类型混用:

class Contact {
  final String name;
  final List<String> phones;

  Contact(this.name, this.phones);

  @override
  String toString() {
    return 'Contact{name: $name, phones: $phones}';
  }
}

void mapContacts() {
  var contact = Contact('Test', ['4160000000', '7780000000']);
  print(contact); // 输出: Contact{name: Test, phones: [4160000000, 7780000000]}
}

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:45:00