提问人:iKK 提问时间:11/6/2023 更新时间:11/6/2023 访问量:31
Dart 中的 myList.where() 方法是否使用引用类型?
Does the myList.where() method in Dart use reference type?
问:
创建我的 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
的第一个日志如下所示:inspect
allProducts
[0] Product
purchaseType = HOUSE
someId = null
[1] Product
purchaseType = CAR
someId = null
的第二个日志如下所示:inspect
allProducts
[0] Product
--> purchaseType = HOUSE
--> someId = 1234 // !!!!!!!!!!!!!!!!!!!
[1] Product
--> purchaseType = CAR
--> someId = null
为什么列表现在发生了变异 ???allProducts
'myList.where() 方法在 Dart 中创建引用类型吗???
如果是,我怎样才能改进我的代码,使其不会发生突变,我可以获得它的完整副本?allProducts
答:
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,这无济于事
评论