Flutter BLoC:管理主要数据类型的状态

Posted

技术标签:

【中文标题】Flutter BLoC:管理主要数据类型的状态【英文标题】:Flutter BLoC: managing the state of primary data types 【发布时间】:2020-08-01 12:48:56 【问题描述】:

我正在使用 Flutter 开发一个移动应用程序。我是 Flutter 的新手。我正在使用 BLoC 进行状态管理。我知道它是专门为管理异步执行而设计的。但 BLoC 的目的也是为了进行状态管理。但我有点困惑,不太确定如何处理 BLoC 中的主要数据类型。

让我们想象一下,我有一个按钮和一个图像。功能是当单击按钮时,图像的可见性将被切换。从字面上看,我们只需要使用一个布尔变量来管理图像的状态。这就是我将如何实现它的方式。

我有一个名为 HomeBloc 的 bloc 类,其实现如下。

class HomeBloc 
  bool _isImageDisplayed = true;
  bool get isImageDisplayed => _isImageDisplayed;
  void set isImageDisplayed(bool displayed) 
     this._isImageDisplayed = displayed;
     

  //the rest of the code for other functionalities goes here


final homeBloc = HomeBloc();

然后在 HomePage 小部件中,当单击按钮时,我在 setState 方法中像这样更新图像的状态。

 this.setState(()         
     homeBloc.isImageDisplayed = false;
 );

我的问题是“这是在 Flutter 中管理 BLoC 中主要数据类型的标准方法”?这是最佳做法吗?我们需要使用 StreamBuilder 吗?我们甚至需要在 BLoC 内部管理它吗?

【问题讨论】:

【参考方案1】:

我猜这不是最佳实践,因为在大型应用程序上使用 setState 变得非常困难,并且重新渲染不会无缘无故更改的小部件。想象一下制作一个电子商务应用程序,然后您只需转到产品页面,将您喜欢的产品添加到购物车中,但是您在主页中设计了一个带有红点的购物车图标,里面有一个数字来指定多少钱您在购物车中获得的产品,因此您通过传递一个 setState 主页路由或整个应用程序的函数来处理 main.dart 文件中该图标的状态,这很难,不是吗?。

谢天谢地,BLoC 和 Provider 模式基本上都在使用 setState,但使用了更好的方式,因此您不必为了文本或其他内容的微小变化而重新渲染整个页面,而只需重新渲染小部件树中的特定小部件。

我还建议使用基于 Provider 和 RxDart (Streams) 构建的 BLoC Provider,因为它可以很好地隔离 UI 代码和业务代码。

检查Provider 和BLoC Provider。

【讨论】:

谢谢。似乎 flutter_bloc 包是最好的选择。

以上是关于Flutter BLoC:管理主要数据类型的状态的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 状态管理(BloC):无状态与有状态小部件

Flutter 状态管理BLoC

没有 BLoC 的 Flutter 状态管理

使用 Flutter BLoC 模式跟踪多个状态

Flutter - flutter_bloc状态管理

Flutter 状态管理之Bloc上