Cubit和Bloc有什么区别?

时间:2020-07-28 09:29:24

标签: flutter bloc

我对Bloc的新版本感到有点困惑:6.0.0,添加了Cubit概念,该bloc是否已贬值,或者我们可以同时使用它们?

3 个答案:

答案 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 方法,这是一个主要调用您的函数的间接层。因此,如果您不需要可追溯性,那么该级别的间接性是不必要的,您可以直接调用您的函数。

流等是also usable in Cubit

请注意,在下一个版本的 Bloc 中,“on”方法将显着减少使用 bloc 的样板。

另一个区别在于测试,bloc_test 可以模拟一个 bloc,而 mockito 可以模拟两者。