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
相关产品推荐
相关产品推荐

