flutter_bloc
通过显式地将输入映射到状态来工作,否则无法工作。
我想你的朋友所说的“保留状态对象”是指任何时刻监听 che BLoC 实例状态的人都会返回相同的状态,这与你使用rxDart
's BehaviorSubject
.
我个人的看法flutter_bloc
是它在复杂的场景中可能过于限制,因为它允许创建BLoC
只处理一个输入和一个输出。
让我向您展示我在谈论这个问题时带来的典型例子。
假设您有一个页面,屏幕上半部分有一个轮播,其中有一些卡(假设这些是借记卡)。
屏幕的后半部分显示一个标签,其中包含卡的当前余额以及使用该卡进行的付款列表。
假设您需要从响应时间截然不同的两个不同 api 检索这两条不同的信息(余额将远远快于付款列表)。
对于这种情况我会使用一个BLoC
with:
- output
stream
用于卡片列表
- input
sink
用于卡选择
- output
stream
为了平衡
- output
stream
付款清单
滚动轮播时,您下沉所选的卡片,然后两个小部件(平衡和列表)将侦听自己的流并相应地更新信息加载状态和数据。
如果你想使用 flutter_bloc 做同样的事情,你必须将其分成三个不同的部分BLoCs
一定:
-
BLoC
服务卡列表
-
BLoC
以卡片作为输入,余额作为输出状态
-
BLoC
以卡作为输入,以付款列表作为输出状态
我们当然可以谈论拥有三个独立的BLoC
出于单一责任和可测试性原因,用于三个不同的信息,但是(再次,这是我非常非常个人的观点)在某些情况下,我认为最好将相同页面/功能的内容包装在同一个页面/功能中BLoC
.
另外,在某些情况下(不是这种情况),您必须执行BLoC
to BLoC
沟通,这意味着拥有BLoC
s 依赖于其他人BLoC
s(在某些情况下这有点让我害怕)
我喜欢构建我的BLoC
按功能对它们进行分组。
在上面的情况下,这些都是与借记卡信息屏幕相关的内容,如果我需要导航到某些详细信息,我可以这样做,将所有逻辑集中到一个中BLoC
.
如果 BLoC 的部分功能可以在其他 BLoC 中通用BLoC
我将概括地提取它们BLoC
并与BLoC
to BLoC
沟通(如this https://gist.github.com/magicleon94/42837a1dda02111bb0abe0b9bf1cac58).
请注意,自从使用flutter_bloc
forces你有多个BLoC
即使可能没有必要,您也会因必须执行BLoC
to BLoC
沟通。
同样,我们可以说这个答案可能是biased,既然是我的一些个人观点,所以把它当作一堆考虑,而不是“法律”。我很乐意收到任何不同意我观点的人的反馈,因为我的BLoC
哲学仍在不断进步,我经常对什么是最好的方法感到矛盾!