使用 flutter_bloc 库的缺点是什么

Kas*_*rop 2 dart flutter flutter-bloc

BLoC 模式的实现有很多版本。其中之一是 Felix Angelov 的 flutter_bloc。在其中一个社交媒体上,我发现 flutter_bloc 不是项目的好选择,应该选择另一个 BLoC 或另一个状态管理。

实际上它是一个小的标准项目,分为多个层:域、应用程序、基础设施和表示。没什么特别的。

所以抱怨错误选择的人说 flutter_bloc:

  1. 隐藏实现细节
  2. 保留一个状态对象(为什么,如果它真的是功能性的,那么你就不会这样做),
  3. 意味着使用的首选方式mapToState- 使用async生成器而不是流

如果有人可以详细说明此声明并列出使用 flutter_bloc 的真正缺点,我将不胜感激。例如对我来说 1) 隐藏实现细节是一个优势,因为我不必直接处理 RxDart。但也许我错过了一些东西。我没有完全理解第 2 点。

mag*_*n94 9

flutter_bloc 通过将输入显式映射到状态来工作,否则无法工作。

我想通过“保留一个状态对象”,你的朋友意味着任何人在任何时候听 che BLoC 的实例状态都将返回相同的状态,这与使用rxDart's获得的状态相同BehaviorSubject

我个人的看法flutter_bloc是,它在复杂场景中的局限性太大,因为它允许创建BLoC只处理一个输入和一个输出的 s。

让我向您展示我在谈论这个问题时提出的典型例子。

假设您有一个页面,在屏幕的上半部分有一个旋转木马,上面有一些卡片(假设它们是借记卡)。屏幕的后半部分显示一个标签,其中包含该卡的当前余额以及使用该卡进行的付款列表。

假设您需要从响应时间非常不同的两个不同 api 中检索这两个不同的信息(余额将比付款列表快得多)。

对于这种情况,我会使用一个BLoC

  • stream卡片列表的输出
  • sink卡片选择输入
  • stream平衡输出
  • stream付款清单的输出

滚动轮播时,您将选择的卡片下沉,然后两个小部件(余额和列表)将侦听自己的流并根据信息加载状态和数据进行相应更新。

如果您想使用 flutter_bloc 做同样的事情,您BLoCs肯定必须将其分为三个不同的部分:

  • BLoC 提供卡片列表
  • BLoC 有一张卡片作为输入,余额作为输出状态
  • BLoC 将卡片作为输入,将支付列表作为输出状态

BLoC出于单一职责和可测试性的原因,我们当然可以谈论为三个不同的信息使用三个单独的s,但是(同样,这是我非常非常个人的意见)在某些情况下,我认为将内容包装在同一页面上会更好/feature 在同一个BLoC.

另外,在某些情况下(不是这个),你必须执行 a BLoCtoBLoC通信,这意味着BLoCs 依赖于其他BLoCs (这在某些情况下让我有点害怕)

我喜欢BLoC按功能对它们进行分组。

在上面的例子中,这些都是与借记卡信息屏幕相关的东西,如果我需要导航到一些细节,我可以这样做,将所有逻辑集中到一个BLoC.

如果一个 BLoC 有一部分特征可以在其他BLoCs 中通用,我会以概括的形式提取它们BLoCBLoC进行BLoC通信(像这样)。

请注意,由于使用flutter_bloc 强制您拥有多个BLoCs,即使它可能没有必要,您将有更高的更改必须执行BLoCtoBLoC通信。

再次,我们可以说这个答案可能有偏见,因为它代表了我的一些个人意见,所以把它当作一堆考虑而不是“法律”。我很乐意从不同意我的人那里得到一些反馈,因为我的BLoC哲学仍在进步,我经常对什么是最好的方法感到矛盾!

  • 嗨,这是一个旧答案,已经过去很多时间了。经过深思熟虑,我转向 flutter_bloc,发现它很棒,并且解决了一些“普通方法”问题,例如冗长和其他问题。我在这里写过:https://medium.com/flutter-community/using-the-bloc-pattern-for-clean-flutter-apps-theory-and-a-practical-example-b5dcad728a2b 希望它能有所帮助主题 (2认同)