我在这里编码时有 2 个列表。
List<Detail> orderDetailList = List();
List<List> allOrders = List();
var result;
String tmpCustomerName;
我的数据以json的形式来自我的数据库,这是我的一些代码。
await Dio().get(myURL).then((value) async {result = json.decode(value.data)});
for (var item in result) {
OrdersDetailModel ordersDetailModel = OrdersDetailModel.fromJson(item);
setState(() {
orders.add(ordersDetailModel);
customerName = ordersDetailModel.customerName;
customerPhone = ordersDetailModel.customerPhone;
var res2 = json.decode(ordersDetailModel.orderDetail);
for (var item2 in res2) {
Detail detail = Detail.fromJson(item2);
orderDetailList.add(detail);
}
allOrders.add(orderDetailList);
print('before $allOrders');
if (tmpCustomerName != customerName) {
orderDetailList.clear();
print('after $allOrders');
}
tmpCustomerName = customerName;
});
}
正如我在问题部分提到的,当我在将其添加到 allOrders 后使用orderDetailList.clear()
时,allOrders 中的值也消失了,因此 allOrders 只有空列表,如您所见,我打印了"之前"和"之后","之前"有价值,但"之后"没有。我做错了什么?或者,在清除订单详细信息列表后,如何将值保留在我的所有订单列表中?
这是referencing error
的明显情况,你正在做。有一个概念叫做Shallow
和Deep
副本。
- 浅:它复制项目,但具有父项目的一些引用。因此,当对其中任何一个进行任何更改时,都会对另一个项目进行更改。你现在正在做什么
- 深层复制:这是复制方法,其中没有对父变量的引用。我们必须做的
因此,让我们快速跳入代码:
// rather than doing add directly from orderDetailsList
// we add the data to the tempList holding the Details list,
// and then add it to the data
for (var item2 in res2) {
Detail detail = Detail.fromJson(item2);
orderDetailList.add(detail);
}
// this will keep the data into the list
List<Detail> tempList = [];
// traversing the item from orderDetailsList
orderDetailList.forEach((item) => tempList.add(item));
// here you add the tempList now holding the data
allOrders.add(tempList);
阅读有关 List.forEach() 的信息。它将为您提供有关该方法的一些概念清晰度。