Как отфильтровать поток в Flutter по одному из его атрибутов? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть этот блок c, который передает ответы продуктов:

class ProductModelBloc {
  ProductModel _productModelRepository;
  StreamController<Response<Product>> _productListController =
  new BehaviorSubject();

  StreamSink<Response<Product>> get productListSink =>
  _productListController.sink;

  Stream<Response<Product>> get productListStream =>
  _productListController.stream;

  ProductModelBloc() {
    _productModelRepository = ProductModel();
    fetchProduct();
}

  fetchProduct() async {
    productListSink.add(Response.loading('Getting Products'));
    try {
      Product products =
      await _productModelRepository.getProductsBySeller(sellerId: 2);
      productListSink.add(Response.completed(products));
    } catch (e) {
      productListSink.add((Response.error(e.toString())));
      print(e);
    }
  }

  dispose() {
    _productListController?.close();
  }
}

Вместо того, чтобы получать все продукты, я хочу добавить фильтр, чтобы я мог получать продукты на основе их categoryId. Как это будет сделано?

Это класс ответа:

class Response<T> {
  Status status;
  T data;
  String message;

  Response.loading(this.message) : status = Status.LOADING;
  Response.completed(this.data) : status = Status.COMPLETED;
  Response.error(this.message) : status = Status.ERROR;

  @override
  String toString() {
    return "Status : $status \n Message : $message \n Data : $data";
  }
}

enum Status { LOADING, COMPLETED, ERROR }

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете передать categoryId в вашем методе fetchProduct и выполнить фильтрацию в самом методе.

fetchProduct({bool applyFilter = false, int categoryId}) async {
  productListSink.add(Response.loading('Getting Products'));
  try {
    Product products =
    await _productModelRepository.getProductsBySeller(sellerId: 2);

    if (applyFilter) {
      Product filteredProducts = // Write filtering logic here;
      productListSink.add(Response.completed(filteredProducts));
    } else {
      productListSink.add(Response.completed(products));
    }
  } catch (e) {
    productListSink.add((Response.error(e.toString())));
    print(e);
  }
}

Примечание: вам также не нужно использовать этот bool, вы можете проверить, является ли categoryId ноль или нет.

...