【问题标题】:What is the difference between Cubit and Bloc?Cubit 和 Bloc 有什么区别?
【发布时间】:2020-11-17 17:07:30
【问题描述】:

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

【问题讨论】:

标签: flutter bloc


【解决方案1】:

Cubit 是 BLoC 模式包的一个子集,它不依赖于事件,而是使用方法来发出新的状态。

因此,我们可以将 Cubit 用于简单的状态,并根据需要使用 Bloc。

【讨论】:

  • 复杂状态是什么意思?什么情况下不能使用Cubit,你能解释一下吗?
  • @AlirezaTaghizadeh,在我看来,您只能使用 Cubit 但正如我所提到的,Cubit 是 Bloc 的一个子集(Bloc 扩展 Cubit),因此您可以将 Cubit 视为功能较少的简化 Bloc . Blocs 比 Cubits 更强大,但 Cubits 更简单。再次,这取决于你要构建什么,大应用程序使用 BLOC(复杂函数),简单应用程序使用 Cubit(更少函数)
  • 不,它与应用程序的大小无关,例如您不能将 cubit 用于流数据,例如流 Firestore,它与应用程序的大小无关,例如用于身份验证在大大小小的应用中最好使用cubit。
  • @AlirezaTaghizadeh 例如:Cubit 没有事件的概念,例如去抖动、switchMap、油门等...不会像 Cubit 那样容易支持,你最好使用 Bloc .
  • 感谢@AlirezaTaghizadeh,现在我对在 bloc 或 cubit 中使用任一事件的条件有信心。
【解决方案2】:

Cubit 非常适合任何应用程序规模。没有一个比另一个更好。

您必须在可追溯性和样板之间做出选择。当你使用一个块时,你有一个包含事件的转换:

Transition {
  currentState: AuthenticationState.authenticated,
  event: LogoutRequested,
  nextState: AuthenticationState.unauthenticated
}

当你使用肘时它不会

Transition {
  currentState: AuthenticationState.authenticated,
  nextState: AuthenticationState.unauthenticated
}

仅此一项即可为您提供可追溯性,因为您只需查看日志即可知道是哪个事件触发了更改。你看到 eventA 发生然后 eventB。但在实践中,对于肘关节,您通常可以从没有“标签”的变化本身推断出可追溯性。

本质上,发出一个动作/事件,然后映射到调用一个函数,就像直接调用函数一样。唯一的根本变化是间接层允许人们在中间做某事。

当你使用一个块时,你必须实现 mapEventToState 方法,你还必须编写你的动作,这是一个主要调用你的函数的间接层。因此,如果您不需要可追溯性,那么这种间接级别是不必要的,您可以直接调用您的函数。

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

【讨论】:

    【解决方案3】:

    Cubit 适用于简单的状态管理,您只需将一种事件绑定到状态。而 Bloc 用于复杂的状态管理,您可以将许多事件映射到状态。

    例如让我们考虑下面Cubit

    class SimpleCubit extends Cubit<SimpleState> {
      SimpleCubit () : super(InitialState());
      
      void updateState(String stateName){
        emit(NewState(stateName));
      }  
    
    }
    

    现在让我们看看Bloc

    class SimpleBloc extends Bloc<SimpleEvent, SimpleState> {
      SimpleBloc() : super(InitialState()){
        on<SimpleEven1>(_handleEvent1);
        on<SimpleEven2>(_handleEvent2)
      }
    
      Future<void> _handleEvent1(SimpleEvent event, Emitter<SimpleState1> emit) async {
       // Put your code here
       emit(SimpleState1(event.args))
    }
    
      Future<void> _handleEvent2(SimpleEvent event, Emitter<SimpleState2> emit) async {
       // Put your code here
       emit(SimpleState2(event.args))
    }
      
    }
    

    要使用Cubit 实现上述代码,我们需要切换案例(样板

    Bloc 强制你将每个事件映射到一个单独的函数,这在你有一个复杂的状态时很好。

    【讨论】:

    • 你不应该将返回 void 的方法命名为 'get ..'
    • 这个答案根本不正确。您可以很好地将 Cubit 与许多状态类一起使用。
    • 这个答案没有意义。是什么阻止了我们在肘中使用开关?
    • 请注意,mapEventToState 已被弃用。 @Deprecated - 使用 on 代替。将在 v8.0.0 中移除
    猜你喜欢
    • 2021-06-12
    • 2021-06-19
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    相关资源
    最近更新 更多