我应该在何时何地将值存储在 BLoC 本身或其状态中
Posted
技术标签:
【中文标题】我应该在何时何地将值存储在 BLoC 本身或其状态中【英文标题】:Where and when should I store values in BLoC itself or its state 【发布时间】:2020-12-01 04:45:04 【问题描述】:上下文
我来自 Redux,正在学习用于全局状态管理的 BLoC 模式。我在定义应该将值作为属性存储在 BLoC 类中的什么位置以及何时应该将值存储在 State 中时遇到了麻烦。
用例
我有一个主页,根据其类别显示一些广告(category
永远不应为空)。我实现了这样的 AdsBloc:
class AdsBloc extends Bloc<AdsEvent, AdsState>
final AdsRepository repository;
AdsBloc(@required this.repository)
: super(AdsInitial(category: Category.DOGS));
@override
Stream<AdsState> mapEventToState(
AdsEvent event,
) async*
// my code
这些是我的 AdsState:
abstract class AdsState
final Category category;
AdsState(this.category);
class AdsInitial extends AdsState
AdsInitial(category) : super(category: category);
class AdsSuccess extends AdsState
final PaginatedAds paginatedAds;
AdsSuccess(this.paginatedAds, category) : super(category: category);
class AdsFailure extends AdsState
AdsFailure(category) : super(category: category);
问题
由于我实现模式的方式,每次更改状态时都需要传递category
。
解决方案?
所以我在想是否可以将类别属性视为 AdsBloc 并将其从状态中删除,这样我可以更好地控制该属性。
【问题讨论】:
嗨,您找到解决方法了吗? 【参考方案1】:实现“类别”作为触发广告加载过程的事件的参数。这样,例如,您将告诉 BLoC 使用“category: Category.DOGS”来“LoadAds”。
class LoadAds extends AdsEvent
final Category category;
LoadAds(
@required this.category,
);
@override
List<Object> get props => [category];
这样您就可以在需要时使用单个 bloc 实例来加载不同的广告类型。先加载 DOGS,2 分钟后加载 CATS 而不是狗。 如果您不需要这种能力 - 那么在 bloc 内部定义类别就很好了。
【讨论】:
以上是关于我应该在何时何地将值存储在 BLoC 本身或其状态中的主要内容,如果未能解决你的问题,请参考以下文章