BLoC模式的实现有很多版本。其中之一是Felix Angelov的flutter_bloc。在其中一个社交媒体上,我遇到了一个声明,即flutter_bloc对于该项目来说不是一个好的选择,应该选择另一个BLoC或另一个状态管理。
实际上,它是一个小型的标准项目,分为几个层次:领域、应用程序、基础设施和表示。
所以那个抱怨错误选择的家伙是在说flutter_bloc:
1.隐藏实施详细信息
1.保留一个状态对象(为什么,如果它是真正的功能,那么你不会这样做),
1.表示使用mapToState
的首选方式-使用async
生成器而不是流
如果有人能详细说明这句话并列出使用flutter_bloc的真实的缺点,我将非常感激。例如,对我来说,第1点)隐藏实现细节是一个优点,因为我不必直接处理RxDart。但也许我错过了一些东西。我没有完全理解第2点。
1条答案
按热度按时间rbl8hiat1#
flutter_bloc
通过显式地将输入Map到状态来工作,否则无法工作。我想你的朋友说的“Retains a state object”是指任何监听BLoC示例状态的人都会得到相同的状态,这和使用
rxDart
的BehaviorSubject
得到的状态是一样的。我个人对
flutter_bloc
的看法是,它在复杂场景中的限制太大,因为它允许创建只处理一个输入和一个输出的BLoC
。让我给你们看一个典型的例子。
假设你有一个页面,在屏幕的上半部分有一个旋转木马,上面有一些卡(假设这些是借记卡),屏幕的下半部分显示一个标签,上面有卡的当前余额和使用该卡进行的支付的列表。
假设您需要从两个不同的api中检索这两条不同的信息,它们的响应时间非常不同(余额将比支付列表快得多)。
在这种情况下,我将使用一个
BLoC
:stream
用于卡片列表sink
进行卡片选择stream
stream
当滚动carousel时,您接收所选的卡片,然后两个小部件(balance和list)将侦听它们自己的流并根据信息加载状态和数据进行更新。
如果你想用flutter_bloc做同样的事情,你必须把它分成三个不同的
BLoCs
:BLoC
提供卡片列表BLoC
,以卡作为输入,余额作为输出状态BLoC
,以卡片作为输入,以支付列表作为输出状态出于单一责任和可测试性的原因,我们当然可以讨论为三个不同的信息设置三个单独的
BLoC
,但是(再次强调,这是我非常非常个人的观点)在某些情况下,我认为最好将相同页面/功能的内容 Package 在同一个BLoC
中。另外,在某些情况下(不是这个),您必须执行
BLoC
到BLoC
的通信,这意味着BLoC
依赖于其他BLoC
(在某些情况下这有点让我害怕)我喜欢将我的
BLoC
结构化,按功能将它们分组。在上面的例子中,这些都是与借记卡信息屏幕相关的内容,如果我需要导航到一些细节,我可以这样做,将所有逻辑集中到一个
BLoC
中。如果一个BLoC有一部分特性可以在其他
BLoC
中通用,我会将它们提取到一个通用的BLoC
中,并使用BLoC
到BLoC
通信(如this)。请注意,由于使用
flutter_bloc
* 强制 * 您拥有多个BLoC
,即使可能不需要,您将不得不执行BLoC
到BLoC
的通信。再一次,我们可以说这个答案可能是有偏见的,因为它包含了我的一些个人观点,所以把它当作一堆考虑因素,而不是“法律”。我很乐意收到任何不同意我的人的反馈,因为我的
BLoC
哲学仍然在进步,我经常对什么是最好的方法感到矛盾!