flutter_bloc 通过将输入显式映射到状态来工作,否则无法工作。
我想“保留一个状态对象”你的朋友的意思是任何人在任何时候听 che BLoC 的实例状态都会回到相同的状态,这与你使用 rxDart 的 @ 得到的相同。 987654325@.
我对@987654326@ 非常个人的看法是,它在复杂场景中可能过于受限,因为它允许创建只处理一个输入和一个输出的BLoCs。
让我向你展示我在谈论这个时提出的典型例子。
假设您在屏幕上半部分有一个带有轮播的页面,其中包含一些卡(假设这些是借记卡)。
屏幕的后半部分显示了一个标签,其中包含卡的当前余额以及使用该卡进行的付款列表。
假设您需要从响应时间非常不同的两个不同 api 中检索这两条不同的信息(余额会比付款列表快得多)。
对于这种情况,我会使用 BLoC 和:
- 为卡片列表输出
stream
- 输入
sink选卡
- 输出
stream进行平衡
- 为付款清单输出
stream
当滚动轮播时,你下沉选择的卡片,然后两个小部件(余额和列表)将监听它们自己的流并根据信息加载状态和数据进行相应的更新。
如果您想使用 flutter_bloc 做同样的事情,您肯定必须将其拆分为三个不同的 BLoCs:
-
BLoC 提供卡片列表
-
BLoC 以卡片为输入,余额为输出状态
-
BLoC 有一张卡片作为输入,支付列表作为输出状态
出于单一职责和可测试性的原因,我们当然可以谈论为三个不同的信息设置三个单独的 BLoCs,但是(再次,这是我非常非常个人的观点)在某些情况下,我认为最好将同一页面/功能的内容包装在同一 BLoC 中。
另外,在某些情况下(不是这个),您必须执行 BLoC 到 BLoC 的通信,这意味着 BLoCs 依赖于其他 BLoCs(这在某些情况下让我感到害怕情况)
我喜欢组织我的BLoCs,按功能对它们进行分组。
在上面的例子中,这些都是与借记卡信息屏幕相关的东西,如果我需要导航到一些细节,我可以将所有逻辑集中到一个 BLoC 中。
如果一个 BLoC 具有在其他 BLoCs 中可以共有的部分功能,我将在通用 BLoC 中提取它们并使用 BLoC 到 BLoC 通信(如 this) .
请注意,由于使用flutter_bloc 强制即使可能没有必要,您也会拥有多个 BLoCs,因此您将不得不执行 BLoC 到 @ 的更高更改987654352@通讯。
再次,我们可以说这个答案可能是有偏见的,因为它是我的一些个人意见,所以把它当作一堆考虑因素而不是“法律”。我很高兴收到任何不同意我的人的反馈,因为我的BLoC 理念仍在进步,我经常对什么是最好的方法感到矛盾!