You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:15:50