【问题标题】:Dart/Flutter: List.where doesn't work as expected inside Observable.combineLatest2Dart/Flutter:List.where 在 Observable.combineLatest2 中无法按预期工作
【发布时间】:2025-12-28 04:40:07
【问题描述】:

我正在使用包含ProductsCategories 的流构建一些逻辑。 Productid,还有一个东西,Categoryproduct 类型为List<String> 的属性,其中字符串代表产品的id。 我正在组合两个流,一个代表产品,另一个代表所选类别,它将生成另一个流,其中包含与所选类别相关的过滤产品。

import 'package:rxdart/rxdart.dart';

class ProductsScreenBloc {
  Observable<List<dynamic>> _products;
  Observable<List<dynamic>> _categories;
  final _selectedCategory = BehaviorSubject<dynamic>.seeded(null);

  ProductsScreenBloc({products, categories}) {
    _products = products;
    _categories = categories;
  }

  Observable<List<dynamic>> get products => _products;

  Observable<List<dynamic>> get productsFiltered =>
      Observable.combineLatest2(_products, selectedCategory,
          (products, category) {
        if (category == null) {
          return products;
        }
        print('click');
        final availableIds = category['products'];

        // final items = products
        //     .where((item) => availableIds.contains(item["name"]))
        //     .toList();

        final List<dynamic> items = [];
        products.forEach((product) {
          if (availableIds.contains(product["id"])) {
            items.add(product);
          }
        });

        print(items);
        print('items filtered');

        return items;
      });

  Observable<List<dynamic>> get categories => _categories;

  Observable<dynamic> get selectedCategory => _selectedCategory.stream;

  Function(dynamic) get selectCategory => _selectedCategory.sink.add;

  dispose() {
    _selectedCategory.close();
  }
}

命令式(forEach 向列表中添加内容)正常工作。当我在列表中使用where 方法时,会出现一些鬼鬼祟祟的错误或类似的东西,它甚至不会在控制台上打印任何东西,而且每次打印、返回、函数调用等......根本不会执行

控制台输出示例(where方法)

flutter: click
flutter: null -- this is the value that is returned from the productsFiltered

控制台输出示例(foreach)

flutter: click
flutter: [array of filtered items]
flutter: items filtered
flutter: [array of filtered items] - return value from the productsFiltered

我在 dartpad 中编写了一些代码示例,两种方式都可以正常工作¯_(ツ)_/¯

void main() {
  final one = {"name": "one"};
  final two = {"name": "two"};
  final three = {"name": "three"};
  final list = [one, two, three];
  final available = ["one", "three"];

  print(list.where((item) => available.contains(item["name"])).toList());
  // [{name: one}, {name: three}]

  final newList = [];

  list.forEach((item) {
    if (available.contains(item["name"])) {
      newList.add(item);
    }
  });

  print(newList); // [{name: one}, {name: three}]
}

【问题讨论】:

    标签: dart flutter rxdart


    【解决方案1】:

    您似乎正在尝试在 List&lt;Map&lt;String, String&gt;&gt; 上使用比较器。我遇到了similar issue,结果发现List.contains() 使用== 运算符,无法对地图进行深度比较。作为一种解决方法,您可以尝试使用LinkedHashSet&lt;Map&lt;String, String&gt;&gt; 而不是此comment 中提到的列表。

    【讨论】: