bloc 3.0.0

  • Readme
  • Changelog
  • Example
  • Installing
  • 100
Bloc Package

Pub Build Status codecov style: effective dart Flutter.io Awesome Flutter Flutter Samples Star on GitHub Discord License: MIT


飞镖程序包,有助于实现BLoC模式 .

该软件包可与flutter_blocangular_bloc一起使用 .

Overview #

Bloc Architecture

该软件包的目标是使实现BLoC设计模式(业务逻辑组件)变得容易.

这种设计模式有助于将表示业务逻辑分开. 遵循BLoC模式有利于可测试性和可重用性. 该软件包抽象了模式的响应方面,使开发人员可以专注于将事件转换为状态.

Glossary #

事件是集团的输入. 它们通常是UI事件,例如按钮按下. Events added到集团,然后转换为States .

状态是集团的输出. 表示组件可以侦听状态流并根据给定状态重绘其自身的某些部分(有关更多详细信息,请参见BlocBuilder ).

在调用mapEventToState之后但在更新Bloc的状态之前added Event时,会发生转换 . Transition由currentState,添加的事件和nextState组成.

BlocSupervisor监督Bloc并委托给BlocDelegate .

BlocDelegate处理所有由BlocSupervisor委托的Bloc的事件. 可用于拦截所有Bloc事件,转换和错误. 这是一种普遍处理日志/分析以及错误处理的好方法 .

Bloc Interface #

initialState是处理任何事件之前的状态(在mapEventToState之前). initialState 必须实现 .

mapEventToState是类扩展Bloc必须实现的方法. 该函数将传入事件作为参数. 每当added事件时,都会调用mapEventToState . mapEventToState必须将该事件转换为新状态,并以Stream的形式返回新状态.

add是一个方法,该方法接受event并触发mapEventToState . 如果已经调用了close ,则随后的所有add调用都将委托给onError方法,该方法可以在Bloc以及BlocDelegate级别上被覆盖.

transformEvents是一种将Stream<Event>以及next函数转换为Stream<State> . 应该由mapEventToState处理的mapEventToState需要传递给next . 默认情况下, asyncExpand用于确保按照接收事件的顺序处理所有事件 . 您可以覆盖transformEvents进行高级使用,以控制调用mapEventToState以及处理事件的频率和特异性.

transformStates是一种将Stream<State>转换为新的Stream<State> . 默认情况下, transformStates返回传入的Stream<State> . 您可以覆盖transformStates进行高级使用,以便控制发生transitions (状态更改)的频率和特异性.

onEvent是一种可以在添加Event时进行覆盖的方法. 这是添加特定于集团的日志记录/分析的好地方 .

onTransition是一种可以在发生Transition时重写的方法. 添加新EventmapEventToState时,会发生Transition . 在更新Bloc的状态之前,将调用onTransition . 这是添加特定于集团的日志记录/分析的好地方 .

onError是一种方法,可以在抛出Exception时重写该方法. 默认情况下,所有异常都将被忽略,并且Bloc功能将不受影响. 这是添加特定于块的错误处理的好地方 .

close是一种关闭eventstate流的方法. 当不再需要Bloc时,应调用close . 一旦调用closeadded events将不会被处理,并且会导致错误传递给onError . 另外,如果在events仍在处理中时调用close ,则bloc将继续处理待处理events以完成操作.

BlocDelegate Interface #

onEvent是一种方法,只要将Event添加到任何 Bloc即可重写该方法. 这是添加通用日志记录/分析的好地方 .

onTransition是一种方法,只要在任何 Bloc发生Transition ,都可以重写该方法以进行处理. 这是添加通用日志记录/分析的好地方 .

onError is a method that can be overriden to handle whenever an Exception is thrown from any Bloc. 这是添加通用错误处理的好地方.

Usage #

为了简单起见,我们可以创建一个CounterBloc例如:

class CounterBloc extends Bloc<CounterEvent, int> {
  @override
  int get initialState => 0;

  @override
  Stream<int> mapEventToState(CounterEvent event) async* {
    switch (event) {
      case CounterEvent.decrement:
        yield state - 1;
        break;
      case CounterEvent.increment:
        yield state + 1;
        break;
    }
  }
}

我们CounterBloc转换CounterEvents为整数.

因此,我们需要像CounterEvent这样定义CounterEvent

enum CounterEvent { increment, decrement }

然后,我们可以将事件添加到我们的集团中,如下所示:

void main() {
  final counterBloc = CounterBloc();

  counterBloc.add(CounterEvent.increment);
  counterBloc.add(CounterEvent.increment);
  counterBloc.add(CounterEvent.increment);

  counterBloc.add(CounterEvent.decrement);
  counterBloc.add(CounterEvent.decrement);
  counterBloc.add(CounterEvent.decrement);
}

随着我们的应用程序的增长并依赖于多个Blocs ,查看所有BlocsTransitions变得很有用. 这可以通过实现BlocDelegate轻松实现.

class SimpleBlocDelegate extends BlocDelegate {
  @override
  void onTransition(Bloc bloc, Transition transition) {
    super.onTransition(bloc, transition);
    print(transition);
  }
}

现在我们有了SimpleBlocDelegate ,我们只需要告诉BlocSupervisorBlocSupervisor中使用我们的委托main.dart .

void main() {
  BlocSupervisor.delegate = SimpleBlocDelegate();

  final counterBloc = CounterBloc();

  counterBloc.add(CounterEvent.increment); // { currentState: 0, event: CounterEvent.increment, nextState: 1 }
  counterBloc.add(CounterEvent.increment); // { currentState: 1, event: CounterEvent.increment, nextState: 2 }
  counterBloc.add(CounterEvent.increment); // { currentState: 2, event: CounterEvent.increment, nextState: 3 }

  counterBloc.add(CounterEvent.decrement); // { currentState: 3, event: CounterEvent.decrement, nextState: 2 }
  counterBloc.add(CounterEvent.decrement); // { currentState: 2, event: CounterEvent.decrement, nextState: 1 }
  counterBloc.add(CounterEvent.decrement); // { currentState: 1, event: CounterEvent.decrement, nextState: 0 }
}

此时,所有Bloc Transitions将报告给SimpleBlocDelegate ,运行我们的应用程序后,我们可以在控制台中看到它们.

如果我们希望能够处理添加到Bloc所有传入Events ,我们还可以在SimpleBlocDelegate重写onEvent .

class SimpleBlocDelegate extends BlocDelegate {
  @override
  void onEvent(Bloc bloc, Object event) {
    super.onEvent(bloc, event);
    print(event);
  }

  @override
  void onTransition(Bloc bloc, Transition transition) {
    super.onTransition(bloc, transition);
    print(transition);
  }
}

如果我们希望能够处理可能在Bloc引发的任何Exceptions ,我们还可以在SimpleBlocDelegate重写onError .

class SimpleBlocDelegate extends BlocDelegate {
  @override
  void onEvent(Bloc bloc, Object event) {
    super.onEvent(bloc, event);
    print(event);
  }

  @override
  void onTransition(Bloc bloc, Transition transition) {
    super.onTransition(bloc, transition);
    print(transition);
  }

  @override
  void onError(Bloc bloc, Object error, StackTrace stacktrace) {
    super.onError(bloc, error, stacktrace);
    print('$error, $stacktrace');
  }
}

此时,所有Bloc Exceptions也将报告给SimpleBlocDelegate ,我们可以在控制台中看到它们.

Dart Versions #

  • 飞镖2:> = 2.6.0

Examples #

  • 计数器 -如何在纯Dart应用中创建CounterBloc的示例.

Maintainers #

3.0.0 #

  • 升级到rxdart ^0.23.0
  • 升级到Dart >= 2.6.0

3.0.0-dev.1 #

  • 升级到rxdart ^0.23.0

2.0.0 #

  • 允许集团在close完成待处理事件的处理( #639
  • 文档更新

1.0.1 #

  • 错误修正: onTransition中引发的onTransition被传递给onError并且不应破坏整体功能( #641
  • 坚持有效的飞镖#561
  • 文档和示例更新

1.0.0 #

  • dispatch and dispose removed
  • 文档更新

0.16.1 #

  • 次要文档更新

0.16.0 #

  • Bloc扩展Stream<State>#558
    • bloc.state.listen > bloc.listen
    • bloc.currentState > bloc.state
  • Bloc实现Sink<Event>#558
    • 不赞成使用add dispatch
    • dispose弃用,取而代之的close
  • 文档和示例更新

0.15.0 #

  • 删除了Bloc event流( #326
  • Renamed transform to transformEvents
  • Added transformStates (#382)

0.14.4 #

其他依赖关系和文档更新.

0.14.3 #

依赖关系和文档更新.

0.14.2 #

  • 不推荐使用的Bloc event流( #326
  • 文档更新

0.14.1 #

内部BlocDelegate更新和文档更新.

0.14.0 #

BlocDelegate初始化改进和文档更新.

  • BlocSupervisor().delegate = ...现在是BlocSupervisor.delegate = ...#304 ).

0.13.0 #

BlocBlocDelegate改进,新功能和文档更新.

  • 改进了dispose以忽略未决事件( #257 ).
  • Bloc上的暴露event流类似于state流,以暴露dispatched事件Stream#259 ).
  • 更新为使用rxdart版本^0.22.0#265 ).
  • BlocDelegate方法包括对Bloc实例( #259 )的引用.
  • Added onEvent to Bloc and BlocDelegate (#259).

0.12.0 #

更新了transform以启用高级事件过滤和处理以及文档更新.

0.11.2 #

添加了BlocDelegate onErroronTransition mustCallSuper和文档更新

0.11.1 #

添加了dispose mustCallSuper和文档更新

0.11.0 #

更新mapEventToState以删除currentState不必要参数

  • Stream<S> mapEventToState(S currentState, E event) -> Stream<S> mapEventToState(E event)
  • 文档更新
  • 示例更新

0.10.0 #

已更新为rxdart ^0.21.0和文档更新

0.9.5 #

对代码样式和文档的较小增强.

0.9.4 #

呼叫dispatchdispose一直被称为触发onErrorBlocBlocDelegate .

0.9.3 #

限制rxdart">=0.18.1 <0.21.0"由于重大更改.

0.9.2 #

文档的其他较小更新

0.9.1 #

对文档的次要更新

0.9.0 #

BlocBlocDelegate错误处理

  • Bloc添加了onError以进行本地错误处理.
  • BlocDelegate添加了onError以进行全局错误处理.

0.8.4 #

mapEventToState处理mapEventToState和文档更新中引发的异常.

0.8.3 #

较小的内部改进和文档更新

0.8.2 #

文档的其他较小更新

0.8.1 #

对文档的次要更新

0.8.0 #

团体忽略重复状态

0.7.8 #

文档的其他较小更新

0.7.7 #

文档的其他较小更新

0.7.6 #

对文档的次要更新

0.7.5 #

Exposed currentState in Bloc

  • 文档更新.

0.7.4 #

更新了mapEventToState参数名称

  • Stream<S> mapEventToState(S state, E event) -> Stream<S> mapEventToState(S currentState, E event)
  • 文档更新.
  • 更新至示例.

0.7.3 #

对文档的次要更新

0.7.2 #

Transition Fix

  • mapEventToState ,带有mapEventToState Bloc (每个事件返回多个状态)将正确报告Transitions .

0.7.1 #

改进纯Dart应用程序中Bloc使用.

  • Bloc状态自动以initialState播种

0.7.0 #

Added BlocSupervisor and BlocDelegate.

  • BlocSupervisor notifies BlocDelegate of Transitions
  • BlocDelegate公开为所有Bloc Transitions调用的onTransition .

0.6.0 #

Transitions and initialState updates.

  • 添加了TransitiononTransition
  • Made initialState required

0.5.2 #

文档的其他较小更新.

0.5.1 #

对文档的次要更新

0.5.0 #

将Flutter Widgets移至flutter_bloc软件包

0.4.2 #

文档的其他较小更新.

0.4.1 #

对文档的较小更新.

0.4.0 #

Added BlocProvider.

  • BlocProvider.of(context)
  • 文档更新.
  • 更新至示例.

0.3.0 #

更新了mapEventToState以将当前状态作为参数.

  • Stream<S> mapEventToState(E event) -> Stream<S> mapEventToState(S state, E event)
  • 文档更新.
  • 更新至示例.

0.2.5 #

文档的其他较小更新.

0.2.4 #

文档的其他较小更新.

0.2.3 #

文档的其他较小更新.

0.2.2 #

文档的其他较小更新.

0.2.1 #

对文档的较小更新.

0.2.0 #

增加了对流转换的支持

  • Includes Stream<E> transform(Stream<E> events)
  • 文档更新

0.1.2 #

文档的其他较小更新.

0.1.1 #

对文档的较小更新.

0.1.0 #

库的初始版本.

  • 包括通过扩展Bloc类来创建自定义Bloc的功能.
  • 包括使用BlocBuilder小部件将表示层连接到Bloc的功能.

example/main.dart

import 'dart:async';

import 'package:bloc/bloc.dart';

enum CounterEvent { increment, decrement }

class CounterBloc extends Bloc<CounterEvent, int> {
  @override
  int get initialState => 0;

  @override
  Stream<int> mapEventToState(CounterEvent event) async* {
    switch (event) {
      case CounterEvent.decrement:
        // Simulating Network Latency
        await Future<void>.delayed(Duration(seconds: 1));
        yield state - 1;
        break;
      case CounterEvent.increment:
        // Simulating Network Latency
        await Future<void>.delayed(Duration(milliseconds: 500));
        yield state + 1;
        break;
      default:
        throw Exception('unhandled event: $event');
    }
  }
}

class SimpleBlocDelegate extends BlocDelegate {
  @override
  void onEvent(Bloc bloc, Object event) {
    super.onEvent(bloc, event);
    print('bloc: ${bloc.runtimeType}, event: $event');
  }

  @override
  void onTransition(Bloc bloc, Transition transition) {
    super.onTransition(bloc, transition);
    print('bloc: ${bloc.runtimeType}, transition: $transition');
  }

  @override
  void onError(Bloc bloc, Object error, StackTrace stacktrace) {
    super.onError(bloc, error, stacktrace);
    print('bloc: ${bloc.runtimeType}, error: $error');
  }
}

void main() {
  BlocSupervisor.delegate = SimpleBlocDelegate();

  final counterBloc = CounterBloc();

  counterBloc.add(CounterEvent.increment);
  counterBloc.add(CounterEvent.increment);
  counterBloc.add(CounterEvent.increment);

  counterBloc.add(CounterEvent.decrement);
  counterBloc.add(CounterEvent.decrement);
  counterBloc.add(CounterEvent.decrement);

  counterBloc.add(null); // Triggers Exception

  // The exception triggers `SimpleBlocDelegate.onError` but does not impact bloc functionality.
  counterBloc.add(CounterEvent.increment);
  counterBloc.add(CounterEvent.decrement);
}

Use this package as a library

1. Depend on it

将此添加到包的pubspec.yaml文件中:


dependencies:
  bloc: ^3.0.0

2. Install it

您可以从命令行安装软件包:

with pub:


$ pub get

使用Flutter:


$ flutter pub get

或者,您的编辑器可能支持pub getflutter pub get . 查看您的编辑器文档以了解更多信息.

3. Import it

现在,在Dart代码中,您可以使用:


import 'package:bloc/bloc.dart';
  
Popularity:
描述该程序包相对于其他程序包的受欢迎程度. [更多]
99
Health:
从静态分析得出的代码运行状况. [更多]
100
Maintenance:
反映出软件包的整洁和最新状态. [更多]
100
Overall:
以上的加权分数. [更多]
100
了解有关得分的更多信息.

我们在2020年1月18日分析了此软件包,并在下面提供了得分,详细信息和建议. using: 分析已完成,状态使用以下命令 :

  • 飞镖:2.7.0
  • 高达:0.13.4

Dependencies

Package Constraint Resolved Available
直接依赖
Dart SDK > = 2.6.0 <3.0.0
meta ^1.1.6 1.1.8
rxdart ^0.23.0 0.23.1
开发依赖
effective_dart ^1.1.1
mockito ^4.0.0
test > = 1.3.0 <2.0.0
test_coverage ^0.2.0

by  ICOPY.SITE