Day27 Flutter—BLoC介绍

BLoC

BLoC全称为 Business Logic Component,表示为业务逻辑组件。是独立处理业务逻辑,网络数据请求等等逻辑的一个模块,通过流的Sinks,Streams发布监听业务处理後的数据结果,其只关心业务处理,而Widget着重看中业务处理後的结果显示。可见Bloc使得业务逻辑和UI相分离。其优点有以下三点:

  • 当业务逻辑内部改动时,尽可能的减少UI程序的改动。
  • 当改动UI时不会对业务逻辑产生影响
  • 方便测试业务逻辑功能

BlocBuilder

BlocBuilder是一个Flutter widget,它需要一个Bloc和一个builder函数。BlocBuilder处理构建小部件以响应新状态。BlocBuilder非常像StreamBuilder,但有一个更简单的API,以减少所需的样板代码量。builder函数可能会被多次调用,并且应该是一个纯函数,它返回一个小部件以响应状态。如果响应状态变化实现想法,例如导航,显示对话框等,就需要BlocListener。在没有bloc参数时,BlocBuilder将使用BlocProvider和当前BuildContext来自动查找bloc。

BlocBuilder<BlocA, BlocAState>( 
builder: (context, state) {

如果想当构造器函数被调用时实现精细粒度的控制,可以提供一个可选的condition和BlocBuilder。condition使用前一个bloc状态和当前bloc状态,并返回一个布尔值。如果condition返回true,builder将携带currentState被调用,从而重建小部件。如condition返回false,builder不会被调用,也不会发生重建。

BlocBuilder<BlocA, BlocAState>( 
condition: (previousState, currentState) { 
builder: (context, state) { 

BlocProvider

BlocProvider是一个Flutter widget,通过BlocProvider.of为子级提供一个bloc。它用作依赖注入(DI)小部件,以便单个bloc实例可以在子树中被提供给多个部件。在大多数情况下,BlocProvider应该用於构建新的blocs,其在子树的其余部分可用。在这种情况下,由於BlocProvider负责创建bloc,它将自动处理销毁bloc。

BlocProvider( 
builder: (BuildContext context) => BlocA(), 
child: ChildA(), 
);

MultiBlocProvider

MultiBlocProvider是一个Flutter小部件,可将多个BlocProvider小部件合并为一个小部件。 MultiBlocProvider提高了可读性并消除了嵌套多个BlocProviders的要求。通过使用MultiBlocProvider可以从:

BlocProvider<BlocA>( 
builder: (BuildContext context) => BlocA(), 
child: BlocProvider<BlocB>( 
builder: (BuildContext context) => BlocB(), 
child: BlocProvider<BlocC>( 
builder: (BuildContext context) => BlocC(), 
child: ChildA(), 
) 
) 
)

变为:

MultiBlocProvider( 
providers: [ 
BlocProvider<BlocA>( 
builder: (BuildContext context) => BlocA(), 
), 
BlocProvider<BlocB>( 
builder: (BuildContext context) => BlocB(), 
), 
BlocProvider<BlocC>( 
builder: (BuildContext context) => BlocC(), 
), 
], child: ChildA(), 
)

BlocListener

BlocListener是一个Flutter小部件,接受一个BlocWidgetListener和一个可选的Bloc并在bloc流出的状态发生变化时调用listener。它应该用於那些每次状态变化都需要响应一次的场景,例如导航、显示一个SnackBar、显示一个Dialog等,不像BlocBuilder中的builder,listener只在每次状态变化时被调用一次,并且它是一个void函数。如果不提供bloc参数,BlocListener将使用BlocProvider和当前BuildContext自动查找。


<<:  找LeetCode上简单的题目来撑过30天啦(DAY26)

>>:  【ModernWeb'21 VIRTUAL EVENT 议程整理】(非官方)

[Android Studio 30天自我挑战] 透过Banner来轮播广告资讯

现在常常在手机或是电脑网页中会在页面中的一部分会看到不同的广告, 这篇我们运用banner在画面中显...

创建App-注册界面(更新)

创建App-注册界面(更新) 在更新版注册中使用了更为好看的样式能装扮,运用了淡化图标作背景,鲜艳的...

Day21-State

前言 昨日我们学会了Props,而Props是由外传进来的资料,进而改变组件。而组件本身的状态我们称...

Day 16 [Python ML、Pandas] 组成群组合排序

import pandas as pd reviews = pd.read_csv("./...

Day-8:Rails的CRUD

CRUD系虾米? CRUD即为Create、Read、Update、Delete等四项基本资料库操作...