1

我正在使用包含Products和的流构建一些逻辑CategoriesProducthasid和另一个东西,Category具有product类型的属性,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}]
}
4

1 回答 1

0

看起来您正在尝试在List<Map<String, String>>. 我遇到了类似的问题,结果发现它List.contains()使用==运算符并且无法对 Maps 进行深度比较。作为一种解决方法,您可以尝试使用 a而不是此评论LinkedHashSet<Map<String, String>>中提到的 List 。

于 2021-12-10T17:00:56.893 回答