未处理的异常:类型“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>”类型的子类型