【问题标题】:How to filter a list of obseravble in stream flutter如何过滤流颤动中的可观察列表
【发布时间】:2019-12-10 14:16:36
【问题描述】:

我需要使用流过滤我的列表。我已经有一个拉所有客户端的流,现在我想过滤掉它们。

我的这段代码工作正常,它会拉动客户端并在列表视图中显示我。我只想过滤从主流中获得的这些数据。有知识的人可以帮帮我吗?

class ClientesControles extends BlocBase {


      final ClienteService clienteService;
      ClientesControles(this.clienteService);

      BuildContext _context;
      init(BuildContext context) {
        _context = context;
      }


      Observable<List<ClienteModel>> get clientesStream => clienteService.clientes;

      final _stringFiltroController = BehaviorSubject<String>();
      Observable<String> get stringFiltroFluxo => _stringFiltroController.stream;
      Sink<String> get stringFiltroEvent => _stringFiltroController.sink;

    @mustCallSuper
      void dispose() {
        _cadnomecliente.close();
        _cadnomefcliente.close();
        _cadtelcliente.close();
        _cademailcliente.close();
        _cadidcliente.close();
        _stringFiltroController.close();
      }
    }

    Class ClienteService{

     Observable<List<ClienteModel>> get clientes =>
          Observable(collection.snapshots().map((item) => item.documents
              .map<ClienteModel>((item) => ClienteModel.fromJson(item.data))
              .toList()));

    }

【问题讨论】:

  • ClientService类是分开的,我放在一起看代码。
  • 看起来这个answer可能会有所帮助

标签: flutter dart stream bloc


【解决方案1】:

要过滤流,请添加 where 子句:

Observable<List<ClienteModel>> get clientes =>
          Observable(collection.snapshots().map((item) => item.documents
              .where((item) => hasWhatIWant(item))
              .map<ClienteModel>((item) => ClienteModel.fromJson(item.data))
             .toList()));

bool hasWhatIWant(item){
  //some check
}

【讨论】:

  • bool hasWhatIWant(item){//some check} 对不起。但是如何定义要过滤的词呢?
  • 在 hasWhatIWant 函数中停止你的代码,看看你得到了什么。 item.contains("myWord") 可能会这样做。
  • bool filtra(ClienteModel item) { var b = 'word'; return item.cadnome.toLowerCase().contains(b); } 不错!
【解决方案2】:

我遇到了类似的问题,并为此奋斗了 3 天,直到我找到了这篇文章......谢谢......我的只是有点不同

Observable<List<Contact>> get contacts => _contactsListFetcher.stream
      .map((s) => s.where((c) => hasFilteredContent(c)).map((i) => i).toList());

  bool hasFilteredContent(Contact contact) {
    return contact.firstName.toLowerCase().contains(currentFilter.toLowerCase()) || contact.lastName.toLowerCase().contains(currentFilter.toLowerCase());
  }   

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多