English 中文(简体)
Cubit和Bloc之间有什么区别?
原标题:What is the difference between Cubit and Bloc?
  • 时间:2020-07-28 09:29:24
  •  标签:
  • flutter
  • bloc

我对布洛茨的新释放感到困惑不解:6.0,加上“Cubit”概念,是集团被贬抑的,还是我们能够利用这两个集团?

最佳回答

锡比是博洛卡模式一揽子计划的一个分支,它并不依赖事件,而是使用方法来排放新的国家。

因此,我们可以将Cubit用于简单国家,并视需要使用Bloc。

<>><>>><>UPD>:进一步比较

选择Cubit胜于Bloc有许多好处。 两项主要福利是:

Cubit is a subset of Bloc; so, it reduces complexity. Cubit eliminates the event classes. Cubit uses emit rather than yield to emit state. Since emit works synchronously, you can ensure that the state is updated in the next line.

问题回答

限额完全适合任何评估比额表,凡表示比另一比额表更佳者,则不知情。 软件结构很少涉及绝对数,而是涉及利弊,更经常地说,不应使用X线really了解所涉影响。

布洛奇基本上是由事件驱动的建筑,而立方米则属于香草。 这同样影响到任何事件驱动的结构。

简言之,事件驱动或未发生

// this is normal / vanilla code, like cubits

myFuction();  // i m just calling my function here, nothing magical going on

myFunction() {
  print( running my function );
}

// this is event driven, like blocs

eventEmitter.emit(SomeEvent()); // emitting an event, i don t know if it will be handled.

on(SomeEvent).exectute(myFunction);
// somewhere else in your code base...
on(SomeEvent).exectute(myAnalyticsFunction);


myFunction() {
  print( my function );
}

myAnalyticsFunction() {
  print( my analytics function );
}

上面的法典显示,在香草执行与驱动的活动之间存在差异。 由于你能够看到事件驱动的建筑有自己的缺陷:

  • adds complexity
  • adds indirection, you do not call the function directly
  • you cannot add a breakpoint to flow through code !
  • you cannot know which handler will execute after an event is emitted just by looking at the source of emission (you have to do a search)
  • you don t know in which order an event will be processed

它增加了以下优势:

  • allow you to decouple the emitting site from the processing sites
  • allows you to add event handlers at will without changing the existing code.
  • allows you to easily add cross cutting concerns (logging, analytics..) by just subscribing to all events.

无论你使用事件驱动的结构,你都丧失了传统法典的某些好处,应当谨慎使用:必要时。

事件驱动的结构的一个好处是,事件可由0或多位操作者使用,而排放者并不关心。 不利的是间接和外部锅炉板。

Bloc vs Cubit

Traceability

当你使用一个集团时,你有一个<代码>传输,其中包含:

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

当你使用时

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

一种好处是,你取得了一些可追溯性,因为你知道,哪一事件只是通过看记录而引发变化。 贵见会活动 当时发生了国家变化。

在实践中,对手来说,你常常在没有“标签”的情况下从变化本身推断出可追溯性,因为没有很多行动能够产生这种变化。

一种不利之处是间接成本,不应低估这种成本,因此,你不能gger弄并沿用《守则》(<>下定义>)。

Event sharing

从本质上讲,放弃一项行动/发明,然后被描绘成一种功能,就象直接称呼这一功能。 唯一的根本变化是,行动必须由多个消费者、集团或其他(例如分析)消费。 如果必须在各集团之间分享行动(例如重新设定的标志数据),那么,各集团可在这方面拥有实力。 然而,在不要求你的整个代码基数使用集团的情况下,还有其他实现这一点的方法。

Cross cutting concerns

我认为,事件驱动的架构的一个方面是,你必须增加大家希望适用于广泛事件的交叉关切。 例如,如果你想把所有活动推向分析,将其分两条法典,如果你已经有集团,就很容易这样做。 然而,即便如此,也要求你与集团站在一起,它只是要求在某个时候宣布一项活动,这将是一个更好的模式。

Conclusion

如果你要求我使用集团或部族,就坐在一席。 如果你有明确的理由使用某种事件,你可以补充。

I don t agree with opinions that you can only use Cubit only for simple cases, or for small apps. I would even say that Cubit can handle pretty complex cases without the need to be converted into a Bloc.

Cubit的主要优势在于它拥有的体积较小的代码,而且对排放国而言,它有直截了当和同步的方式(因为没有Event类别,但只是一种简单的功能)。 在多数情况下,如果你不敢改变你的活动,你就能够轻易使用<>Cubits。 在你需要改变事件的这些罕见情况下,你可以很容易地将<>Cubit改为Bloc,因为两者都延伸到BlocBase

<>Cubit和Bloc之间的主要区别是,在Bloc,除国家外,还有 Event。 因此,您能够使用<代码>Eventtransformer功能,以操纵您的活动。 例如,你可以给你的活动增加欺骗或ttle。 甚至有些复杂的事件流图。 这主要得益于使用<>Bloc而不是Cubit

使用<代码>Eventtransformer进行放弃活动:

import  package:stream_transform/stream_transform.dart ;

EventTransformer<Event> _debounce<Event>(Duration duration) {
  return (events, mapper) => events.debounce(duration).switchMap(mapper);
}

使用<代码>_debounce

class ExampleBloc extends Bloc<ExampleEvent, ExampleState> {
  const ExampleBloc()
      : super(const ExampleState()) {
    on<ExampleEvent>(
      _onExampleEvent,
      transformer: _debounce(Duration(seconds: 1)),
    );
  }
  ...
}

基本上,这在<>Cubit和之间产生了核心差异。

P.S. 在项目中使用Blocs /Cubits的情况也相当令人信服,有些小组可能仅仅因为代码的一致性而使用Blocs。

My rule is to use Cubit for simple State management where you just have one kind of event to bind to the state. And use Bloc for complex state management where you can have many events to map to states.

例如,请在<条码>下考虑。

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

}

现在请看<代码>。 Bluc

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。

我这样说,各集团在穿梭问题上的最大优势是集团能够仓促地避开各国。 这意味着,在做一些需要时间(如等待一纸pi的回复)和在答复到达后放弃“一”状态时,你可以放弃装货国。 多个国家在集团中是常见的,因此在集团中不是如此。





相关问题
Flutter App cannot be installed on Android TV

I m building a Flutter app that should support Android TV and Mobile devices. Despite Google Play shows that it is supported, I cannot install app on my MiBox device. While trying to install it, both ...

Moving the icon button to the right causes rendering issues

I am trying to align the icon button to the right of the Text field, I tried the row which made the icon button not centered vertically and now I am trying out the Stack widget. Here is my code - ...