【问题标题】:Flutter, is rx dart required for BLoC?Flutter,BLoC 需要 rx dart 吗?
【发布时间】:2021-04-21 20:27:13
【问题描述】:

在我看过的 bloclibrary 官网文档中,我从未见过他们使用 rx dart。

但是,有时在社区中,他们说一起使用 rx dart 要好得多。但我不明白。我使用 firestore 作为后端,我只是觉得我根本不需要 rxdart。即使我努力搜索,我也无法看到使用 rx dart + BLoC 的好的示例项目。

如果你在 BLoC 中使用 rx dart 有什么好处?我可以看一个例子吗?

【问题讨论】:

    标签: flutter bloc


    【解决方案1】:

    您将 BLoC 模式与 Bloc 库混合在一起。

    BLoC 模式是一种反应式状态管理解决方案,由 Google 创建。它的目标是充当应用中数据之间的中间人,例如,处理 API 和 UI 之间的状态和业务逻辑。

    它是独立于平台的,这意味着 Bloc 中的相同 dart 代码可以在 Flutter 和 Angular 等框架中工作。

    通常,使用 RxDart,您可以像这样创建 BLoC:

    class AppDataBloc {
      // The publish subject is responsible for get/add data and 
      // pass it to the UI as a stream.
      final _appDataSubject = PublishSubject<AppData>();
    
      // This is the stream the UI will use.
      Observable<AppData> get appData => _appDataSubject.stream;
    
    }
    

    另一方面,Bloc 库是 BLoC 模式的实现。

    它不仅提供了一种简单、统一和直观的方式来实现 BLoC 模式,而且还使您的应用非常易于测试和维护。

    所以要回答你的问题,你不需要 RxDart,除非你想自己实现 BLoC 模式。如果您使用 Bloc 库,那么您已经在使用 BloC 模式的免费 RxDart 实现。

    【讨论】:

      【解决方案2】:

      如果您参考 Felix Angelov 创建的 bloc 包,您不一定需要使用 rx_dart,但您可以。

      例如,您可以在 transformEvents 和/或 transformTransitions 上应用一些 rx_dart 运算符,例如 switchMap、where、debounce、throttle 等。通过这种方式,您可以操纵即将到来的事件(例如施加背压,这将避免服务器因过多的请求而过载)

      Bloc lifecycle

      如果您想充分利用反应式流,您可以探索rx_bloc 生态系统,它是包含 rx_dart 的业务逻辑组件模式的实现。。 p>

      基本上,您需要声明特定功能的合同,然后以反应方式实现符合它的 bloc。例如,如果您需要从 API 获取一些新闻,您需要以这种方式声明合约:

      /// A contract, containing all News BloC incoming events
      abstract class NewsBlocEvents {
        /// Send a search event to the bloc with some payload
        void search({required String query});
      }
      
      /// A contract, containing all News BloC states
      abstract class NewsBlocStates {
        /// The news found by the search query
        ///
        /// It can be controlled by executing [NewsBlocStates.search]
        ///
        Stream<Result<List<News>>> get news;
      }
      

      现在当所有合约都定义好后,你需要实现 Reactive BloC

      /// A BloC responsible for the news
      @RxBloc()
      class NewsBloc extends $NewsBloc {
        /// The default constructor injecting a repository through DI
        NewsBloc(this._repository);
        
        /// The repository used for data source communication
        final NewsRepository _repository;
      
        /// Your events-to-sate business logic
        @override
        Stream<Result<List<News>>> _mapToNewsState() =>                 
            _$searchEvent
                /// Here you can apply any of the rx_dart operators
                /// for instance, you can apply back pressure
                .debounceTime(Duration(seconds: 1))
                /// Then you get the data from the repository
                .switchMap((_) => 
                    _repository.decrement().asResultStream(),
                );
      }
      

      实现业务逻辑后,您可以使用flutter_rx_bloc 访问小部件树中的块。有很多articles 和示例,您可以在其中学习如何使用这个生态系统。

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 2023-01-17
        • 2021-08-20
        • 2021-02-04
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 2021-03-15
        • 2020-05-06
        相关资源
        最近更新 更多