未处理的异常:类型“List<dynamic>”不是“List<CustomerTransactionDetail>”类型的子类型
Posted
技术标签:
【中文标题】未处理的异常:类型“List<dynamic>”不是“List<CustomerTransactionDetail>”类型的子类型【英文标题】:Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<CustomerTransactionDetail>' 【发布时间】:2021-09-16 06:10:50 【问题描述】:customerDetailGet['customer_transaction_detail']
接收数组列表 如何将数组列表分配给模型的 CustomerTransactionDetail 列表
完整代码
实际使用Provider。我有客户交易详细信息的模型,所以我想分配新的接收列表数组并添加到之前的 CustomerTransactionDetail 列表中 但是错误
var url = Uri.https(BaseUrl.apiBaseUrl,
BaseUrl.apiBaseUrlSecond + 'add_customer.php', );
Map object =
"c_name": nameController.text,
"c_mobile": mobileController.text,
"c_address": addressController.text,
"login_id": Constants.loginId,
;
var source = await http.post(url, body: jsonEncode(object));
if (source.statusCode == 200)
if (jsonDecode(source.body)["status"] == 200)
var message = jsonDecode(source.body)["result"]["message"];
var customerDetailGet =
jsonDecode(source.body)["result"]["customer_detail"];
var customerDetail = CustomerDetail(
accountType: customerDetailGet['account_type'],
address: customerDetailGet['address'],
conversationNo: customerDetailGet['conversation_no'],
currentBalance: customerDetailGet['current_balance'],
customerTransactionDetail: customerDetailGet['customer_transaction_detail'], // error line
id: customerDetailGet['id'],
mobile: customerDetailGet['mobile'],
name: customerDetailGet['name'],
status: customerDetailGet['status'],
);
int debitBalance = jsonDecode(source.body)["result"]
["credit_debit_balance"]["debit_balance"];
int creditBalance = jsonDecode(source.body)["result"]
["credit_debit_balance"]["credit_balance"];
Provider.of<CustomerAndTransactionClassProvider>(context,
listen: false)
.addCustomer(customerDetail, debitBalance, creditBalance);
setState(()
responseResult = message;
isLoadding = false;
);
Navigator.pop(context);
else if (jsonDecode(source.body)["status"] == 202)
setState(()
responseResult = jsonDecode(source.body)["result"]["message"];
isLoadding = false;
);
else
setState(()
responseResult = "sorry try again";
isLoadding = false;
);
【问题讨论】:
【参考方案1】:您必须指定变量customerDetailGet
的类型。
如果你不这样做,Dart 会假定它是一个 dynamic
并且可能无法按照你想要的方式处理它(这会导致你得到的异常)。
指定类型最简单的方法是写:
List<CustomerTransactionDetail> customerDetailGet = List<CustomerTransactionDetail>.from(
jsonDecode(source.body)["result"]["customer_detail"]
);
但是,如果CustomerTransactionDetail
不是其中一种基本类型的子类型,这可能会失败。
因此,您可能必须创建一个新列表并实例化所有值:
List<CustomerTransactionDetail> customerDetailGet = List<CustomerTransactionDetail>.from(
jsonDecode(source.body)["result"]["customer_detail"].map(
(customerDetail) => CustomerTransactionDetail.fromJson(customerDetail)
)
);
在这种情况下,您必须实现 factory constructor CustomerTransactionDetail.fromJson
。
【讨论】:
以上是关于未处理的异常:类型“List<dynamic>”不是“List<CustomerTransactionDetail>”类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章
未处理的异常:类型 'List<dynamic>' 不是类型 'Map<String, dynamic>' 的子类型
Dart 未处理的异常:类型 'List<dynamic>' 不是类型 'Family' 的子类型,- Flutter
未处理的异常:类型“List<dynamic>”不是“List<CustomerTransactionDetail>”类型的子类型
未处理的异常:类型'List<dynamic>'不是'String'类型的子类型无法获取json数据[重复]
未处理的异常:类型“ImmutableMap<String, dynamic>”不是类型转换中“List<dynamic>”类型的子类型
未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型