我对Bloc的新版本感到有点困惑:6.0.0,添加了Cubit概念,该bloc是否已贬值,或者我们可以同时使用它们?
答案 0 :(得分:11)
Cubit是BLoC Pattern程序包的子集,它不依赖事件,而是使用方法来发出新状态。
因此,我们可以将Cubit用于简单状态,并根据需要使用Bloc。
答案 1 :(得分:1)
Cubit 适用于简单的状态管理,您只需将一种事件绑定到状态。而 Bloc 用于复杂的状态管理,您可以将许多事件映射到状态。
例如让我们考虑以下Cubit
class SimpleCubit extends Cubit<SimpleState> {
SimpleCubit () : super(InitialState());
void getState(String stateName){
emit(NewState(stateName));
}
}
上面的状态管理只有一个你可以命名为 getStateByName
的事件,因此 Cubit 就足够了。
现在让我们看看区块
class SimpleBloc extends Bloc<SimpleEvent, SimpleState> {
SimpleBloc() : super(InitialState());
@override
Stream<SimpleState> mapEventToState(SimpleEvent event) async* {
switch(event){
case SimpleEven1:
yield SimpleState1(event.args)
break;
case SimpleEven2:
yield SimpleState2(event.args)
break;
}
}
}
您可以看到,对于使用 bloc 进行复杂状态管理,很容易将事件绑定到仍然使用事件将数据发送到状态作为 args
的状态。 Bloc 提供了更大的灵活性。
答案 2 :(得分:0)
Cubit 非常适合任何应用规模。
您必须在可追溯性和样板之间做出选择。当你使用一个块时,你有一个包含事件的转换:
Transition {
currentState: AuthenticationState.authenticated,
event: LogoutRequested,
nextState: AuthenticationState.unauthenticated
}
当你使用 cubit 时它不会
Transition {
currentState: AuthenticationState.authenticated,
event: LogoutRequested,
nextState: AuthenticationState.unauthenticated
}
但是,当您使用 bloc 时,您必须实现 mapEventToState 方法,这是一个主要调用您的函数的间接层。因此,如果您不需要可追溯性,那么该级别的间接性是不必要的,您可以直接调用您的函数。
请注意,在下一个版本的 Bloc 中,“on”方法将显着减少使用 bloc 的样板。
另一个区别在于测试,bloc_test 可以模拟一个 bloc,而 mockito 可以模拟两者。