我正在使用包含Products
和的流构建一些逻辑Categories
。Product
hasid
和另一个东西,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}]
}