Dart按BankName匹配合并动态List JSON的类型错误解决
问题:合并银行账户列表时的类型错误
现有存储用户银行账户信息的动态列表existedAccountList,结构包含BankName与accountsDetails字段。当用户在HDFC银行新增账户时,账户被存储在动态列表accountList中,需将其合并到existedAccountList对应BankName的accountsDetails字段中。编写的合并函数出现以下类型错误:
Uncaught Error: TypeError: Instance of 'JSArray
': type 'JSArray ' is not a subtype of type 'Iterable<Map<String, String>>'
示例数据
现有列表existedAccountList
[ { "BankName":"HDFC", "accountsDetails":[ { "Type":"SAVINGS", "accReferenceNumber":"HDFC560811476", "AccNumber":"XXXXX1476" }, { "Type":"current", "accReferenceNumber":"HDFC560811476", "AccNumber":"XXXXX1476" } ] } ]
新增账户列表accountList
[ { "Type":"SAVINGS", "accReferenceNumber":"HDFC002255588", "AccNumber":"XXXXX1564" }, { "Type":"current", "accReferenceNumber":"HDFC002255589", "AccNumber":"XXXXX1576" } ]
原错误函数
List<dynamic> addAccountToExistedBankAccountList( List<dynamic> existedAccountList, List<dynamic> accountlist, String bankName, ) { for (Map data in existedAccountList) { if (bankName.toLowerCase() == data["BankName"].toString().toLowerCase()) { data["accountsDetails"].addAll(accountlist); } } return existedAccountList; }
错误原因
报错核心是类型不匹配:Dart推断data["accountsDetails"]为Iterable<Map<String, String>>类型,但传入的accountlist是List<dynamic>,直接调用addAll触发类型检查失败。
修正后的代码
通过显式类型转换和检查,解决类型兼容问题,同时提升代码健壮性:
List<dynamic> addAccountToExistedBankAccountList( List<dynamic> existedAccountList, List<dynamic> accountlist, String bankName, ) { for (var data in existedAccountList) { // 先校验data的类型是否为Map,避免类型转换失败 if (data is Map && bankName.toLowerCase() == data["BankName"].toString().toLowerCase()) { var accounts = data["accountsDetails"]; // 校验accountsDetails是否为List类型 if (accounts is List) { // 将动态列表转换为目标Map类型后批量添加 accounts.addAll(accountlist.cast<Map<String, dynamic>>()); } } } return existedAccountList; }
关键优化点
- 增加类型校验:提前判断
data和accountsDetails的类型,避免潜在的空指针和类型错误 - 类型转换:用
cast<Map<String, dynamic>>()将动态列表转换为addAll可接收的类型 - 逻辑保留:完全保留原合并逻辑,同时提升代码的稳定性
内容的提问来源于stack exchange,提问作者Sarvjeet
相关产品推荐
相关产品推荐

