Dart疑难:两个商品列表函数为何不独立?调用后getUnbought返回空
问题分析与解决方案
问题根源
你的getUnbought()函数中,List<Item> result = availableProducts;这行代码并没有创建新列表,只是把全局列表availableProducts的引用赋值给了result。Dart中列表是引用类型,后续调用result.removeWhere()时,实际上是直接修改了全局的availableProducts本身。
当你先调用getBought()再执行getUnbought()时:
getBought()从数据库获取已购商品列表,此时全局availableProducts仍保持完整;getUnbought()执行时,会根据数据库中的已购商品,通过result的引用直接修改availableProducts,删除对应元素,导致全局列表被清空;- 后续再调用
getUnbought()时,全局availableProducts已经是空的,自然返回空列表。
而单独调用getUnbought()时,如果数据库中boughtItems为空,removeWhere()不会执行,全局列表未被修改,因此能返回完整数据。
修复方案
在getUnbought()中创建availableProducts的副本,而非直接引用原列表,这样修改的只是局部副本,不会影响全局数据。有两种常用方式:
方式一:使用List.from()创建副本
List<Item> result = List.from(availableProducts);
方式二:使用扩展运算符创建副本
List<Item> result = [...availableProducts];
修改后的完整getUnbought()函数:
Future<List<Item>> getUnbought() async { await database; List products = await _database!.query("boughtItems"); // 创建全局列表的副本,避免修改原列表 List<Item> result = [...availableProducts]; for (var element in products) { result.removeWhere((unBought) => unBought.id == element["id"]); } return result; }
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

