我正在进入BLOC,我没有看到最好的方法,使我的User对象可以被来自多个BLOC的事件改变。
示例-假设我正在构建一个社交媒体应用程序
AuthBloc包含Sign up / Sign in事件,成功时发出带有User对象的状态,其中包含一些基本数据和帖子列表。
主屏幕读取该状态并显示来自用户对象的数据。
问题:
作为不同的BLOC的一部分-让我们说PostBloc -有与用户帖子的CRUD操作相关的事件。
这些事件中的每一个都改变User对象的“posts”List,因此它返回一个新的User对象,其中包含更新的posts列表。
这会产生一个问题,因为从AuthBloc返回的User状态是旧的,不再相关,因为PostBloc的状态返回的User与AuthBloc + new posts列表的数据相同。
这里最好的方法是什么?我试着查找不同的示例以及官方的Bloc示例,但它们似乎都不是很完整--它们都喜欢覆盖基本的身份验证流程,但实际上从来没有进一步讨论如何管理用户状态。
理想情况下,我想让它,使每个块可以更新用户对象的属性,但我看不到的方法,如果我们认为,一切都应该导致块事件和事件应该发出新的状态。
3条答案
按热度按时间f0brbegy1#
在BLOC上有两个状态。
https://bloclibrary.dev/#/blocnamingconventions:~:text =%E2%9C%85-,好,-sealed%20class%20CounterEvent
我认为你也应该更新Usebloc状态下的用户数据。我建议您使用SingleClass状态
aor9mmx12#
看看这篇文章,希望对你有帮助:
The Observer Pattern: Facilitating Bloc Dependency Management in Dart
shstlldc3#
我不同意你的说法,文件不是很完整。您有一个简单的块到块通信问题,在www.example.com的体系结构部分中非常具体地解决了这个bloclibary.dev
来自文档:
第一个月
字符串
While the code above is error free (and even cleans up after itself), it has a bigger problem: it creates a dependency between two blocs.
个Generally, sibling dependencies between two entities in the same architectural layer should be avoided at all costs, as it creates tight-coupling which is hard to maintain. Since blocs reside in the business logic architectural layer, no bloc should know about any other bloc.
个Application Architecture Layers
个A bloc should only receive information through events and from injected repositories (i.e., repositories given to the bloc in its constructor).
个If you're in a situation where a bloc needs to respond to another bloc, you have two other options. You can push the problem up a layer (into the presentation layer), or down a layer (into the domain layer).
个Connecting Blocs through Presentation You can use a BlocListener to listen to one bloc and add an event to another bloc whenever the first bloc changes.
个型
The code above prevents SecondBloc from needing to know about FirstBloc, encouraging loose-coupling. The flutter_weather application uses this technique to change the app's theme based on the weather information that is received.
个因此,在您的示例中,只需创建一个
BlocListener<PostBloc>
小部件,并在listener
回调中,从AuthBloc
触发一个事件,该事件通过该事件接收Posts
的列表,并使用更新后的列表更新User
对象。这样,在PostBloc
的任何CRUD操作之后,User
对象将自动更新。我不推荐其他答案之一建议的观察者模式,因为a)它违背了库创建者推荐的模式,b)它比需要的更复杂。