如何解决我应该在何时何地将值存储在BLoC本身或其状态中
上下文
我来自Redux,正在学习全球状态管理的BLoC模式。我在定义将值存储在BLoC类内部的位置以及何时将值存储在状态内部时遇到麻烦。
用例
我有一个主页,在其中显示一些广告,具体取决于其类别(category
永远不能为null)。我实现了这样的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
。
解决方案?
因此,我在考虑是否可以将category属性视为AdsBloc并将其从状态中删除,这样我就可以更好地控制此属性。
解决方法
将“类别”作为触发广告加载过程的事件的参数。例如,通过这种方式,您将告诉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本身中定义类别。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。