Dart 中的 myList.where() 方法是否使用引用类型?

Does the myList.where() method in Dart use reference type?

提问人:iKK 提问时间:11/6/2023 更新时间:11/6/2023 访问量:31

问:

创建我的 Flutter 应用程序时,我显然正在使用 Dart。

现在,来自其他编程语言的一些东西让我非常困惑:

import 'dart:developer'; // so that inspect works

// List<Product> allProducts = [
//   Product(
//     purchaseType: PurchaseType.HOUSE,  // enum type
//     someId: null  // String? type
//   ),
//   Product(
//     purchaseType: PurchaseType.CAR, // enum type
//     someId: null  // String? type
//   )
// ];

List<Product> updateProduct = allProducts.where((p) {
    return (p.purchaseType == PurchaseType.HOUSE);
}).toList();

inspect(allProducts);
updateProduct[0].someId = "1234";
inspect(allProducts);

请注意,我检查(即我实际上不打算改变的原始列表)!allProducts

的第一个日志如下所示:inspectallProducts

[0] Product
  purchaseType = HOUSE
  someId = null
[1] Product
  purchaseType = CAR
  someId = null

的第二个日志如下所示:inspectallProducts

[0] Product
  --> purchaseType = HOUSE
  --> someId = 1234     // !!!!!!!!!!!!!!!!!!!
[1] Product
  --> purchaseType = CAR
  --> someId = null

为什么列表现在发生了变异 ???allProducts

'myList.where() 方法在 Dart 中创建引用类型吗???

如果是,我怎样才能改进我的代码,使其不会发生突变,我可以获得它的完整副本?allProducts

数组 flutter list dart 引用类型

评论


答:

1赞 Ivo 11/6/2023 #1

这两个列表都引用相同的对象。您需要制作一份深拷贝才能使其正常工作。顺便说一句,这在许多(大多数?)面向对象的编程语言中都是这样工作的。飞镖也不例外。你可以做这样的事情来让它工作

List<Product> updateProduct = allProducts.map((p)=>p.copy()).where((p) {
    return (p.purchaseType == PurchaseType.HOUSE);
}).toList();

然后添加一个方法,返回自身的副本copy()Product

评论

0赞 iKK 11/6/2023
谢谢 Ivo,我经常使用 Swift,数组(即列表)从来都不是引用类型。你说的效果很好。谢谢。
0赞 Ivo 11/6/2023
@iKK啊,好吧,我没有那么多经验。我的背景更多地在于 Java 和 Kotlin,它的工作方式也是这样
0赞 Md. Yeasin Sheikh 11/6/2023
创建一个(复制)列表怎么样allProducts.toList().where..
0赞 Ivo 11/7/2023
@Md.YeasinSheikh,这无济于事