我应该在何处以及何时将值存储在 BLoC 本身或其状态中
Where and when should I store values in BLoC itself or its state
上下文
我来自 Redux,正在学习用于全局状态管理的 BLoC 模式。我在定义 BLoC class 中应该将值存储为属性的位置以及何时应将值存储在 States 中时遇到问题。
用例
我有一个主页,其中显示了一些广告,具体取决于其类别(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 并将其从状态中删除,这样我可以更好地控制此 属性。
将“类别”作为触发广告加载过程的事件的参数。这样,例如,您将告诉 BLoC 使用“类别: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 本身内定义类别就完全没问题了。
上下文
我来自 Redux,正在学习用于全局状态管理的 BLoC 模式。我在定义 BLoC class 中应该将值存储为属性的位置以及何时应将值存储在 States 中时遇到问题。
用例
我有一个主页,其中显示了一些广告,具体取决于其类别(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 并将其从状态中删除,这样我可以更好地控制此 属性。
将“类别”作为触发广告加载过程的事件的参数。这样,例如,您将告诉 BLoC 使用“类别: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 本身内定义类别就完全没问题了。