当前位置:网站首页>使用 BlocConsumer 同时构建响应式组件和监听状态
使用 BlocConsumer 同时构建响应式组件和监听状态
2022-07-07 21:34:00 【岛上码农@公众号同名】
前言
在上一篇Flutter 入门与实战(八十九):使用BlocListener
处理状态变化中,我们利用了 BlocListener
监听状态变化并做一些相应的处理,同时使用了 BlocBuilder
构建了响应式界面。回顾代码,我们会发现存在冗余的部分,我们需要将 BlocBuilder
作为 BlocListener
的子组件,这其实有点别扭,因为 BlocBuilder
构建的页面按说不应该是 BlocListener
的子组件,而是同级结构。那有没有更好的方式解决这个问题呢,事实上,flutter_bloc 给出了 BlocConsumer
来解决这一问题。
BlocConsumer实现机制
BlocConsumer
像是 BlocBuilder
和 BlocListener
的聚合组件,支持构建响应式组件的同时监听状态变化。同时也支持按条件刷新组件或响应状态变化监听回调。BlocConsumer 的构造方法如下:
const BlocConsumer({
Key? key,
required this.builder,
required this.listener,
this.bloc,
this.buildWhen,
this.listenWhen,
}) : super(key: key);
其中参数说明如下:
builder
:响应式组件构造方法,和BlocBuilder
的相同。listener
:状态变化处理监听回调函数,和BlocListener
的定义一致。bloc
:可选的Bloc
状态对象,如果没有指定,会自动从当前的BuildContext
中查找对应类型的状态对象。buildWhen
:可选参数,接收前后的状态对象,可以根据前后状态对象返回bool
值,若为true
才会刷新组件。listenWhen
:可选参数,接收前后的状态对象,可以根据前后状态对象返回bool
值,若为true
才会调用listener
回调方法。
再来看BlocConsumer
的 builder
方法:
@override
Widget build(BuildContext context) {
if (widget.bloc == null) context.select<B, int>(identityHashCode);
return BlocBuilder<B, S>(
bloc: _bloc,
builder: widget.builder,
buildWhen: (previous, current) {
if (widget.listenWhen?.call(previous, current) ?? true) {
widget.listener(context, current);
}
return widget.buildWhen?.call(previous, current) ?? true;
},
);
}
可以看到,实际实现还是基于 BlocBuilder
实现,而在 BlocBuilder
的 builderWhen
中,会根据 listenWhen
的返回值来决定是否调用 listener
回调方法,从而实现了 BlocBuilder
和BlocListener
的聚合。
BlocConsumer 应用
我们对上一篇的代码进行改造,然后看一下两部分代码的比对,如下图所示。
可以看到,代码的行数其实没什么改变,但是整个代码的层级会更清晰,这样会使得代码更易于维护,完整代码已经上传至:BLoC 状态管理代码。
总结
本篇介绍了 BlocConsumer
的实现机制,以及比对了 BlocBuilder
和BlocListener
分开实现时的差异。通过对比发现可以看到,BlocConsumer
这种聚合了 BlocBuilder
和 BlocListener
的方式在这种场景下的代码层级更清晰,也易于维护。
边栏推荐
- TCP/IP 协议栈
- Which financial products will yield high returns in 2022?
- POJ 3140 contents division "suggestions collection"
- Magic weapon - sensitive file discovery tool
- POJ 3140 Contestants Division「建议收藏」
- Jetty: configure connector [easy to understand]
- How polardb-x does distributed database hotspot analysis
- Demon daddy B3 read extensively in a small amount, and completed 20000 vocabulary+
- [colmap] sparse reconstruction is converted to mvsnet format input
- [uvalive 6663 count the regions] (DFS + discretization) [easy to understand]
猜你喜欢
2022 how to evaluate and select low code development platforms?
cv2.resize函数报错:error: (-215:Assertion failed) func != 0 in function ‘cv::hal::resize‘
Redis - basic use (key, string, list, set, Zset, hash, geo, bitmap, hyperloglog, transaction)
Jerry's manual matching method [chapter]
EasyCVR配置中心录像计划页面调整分辨率时的显示优化
Where is the big data open source project, one-stop fully automated full life cycle operation and maintenance steward Chengying (background)?
L2: current situation, prospects and pain points of ZK Rollup
Have you ever been confused? Once a test / development programmer, ignorant gadget C bird upgrade
Open source OA development platform: contract management user manual
QT compile IOT management platform 39 alarm linkage
随机推荐
Win11时间怎么显示星期几?Win11怎么显示今天周几?
Jerry's configuration of TWS cross pairing [article]
Feature generation
Develop those things: go plus c.free to free memory, and what are the reasons for compilation errors?
Jerry's test box configuration channel [chapter]
npm uninstall和rm直接删除的区别
The new version of onespin 360 DV has been released, refreshing the experience of FPGA formal verification function
OpenGL super classic learning notes (1) the first triangle "suggestions collection"
Nine degree 1201 - traversal of binary sort number - binary sort tree "suggestions collection"
Win11如何解禁键盘?Win11解禁键盘的方法
【colmap】稀疏重建转为MVSNet格式输入
Problems encountered in installing mysql8 for Ubuntu and the detailed installation process
How to turn on win11 game mode? How to turn on game mode in win11
[UVALive 6663 Count the Regions] (dfs + 离散化)[通俗易懂]
How can big state-owned banks break the anti fraud dilemma?
Lex & yacc of Pisa proxy SQL parsing
Restore backup data on persistent volumes
Ternary expressions, generative expressions, anonymous functions
强化学习-学习笔记9 | Multi-Step-TD-Target
Codeforces Round #275 (Div. 2) C – Diverse Permutation (构造)[通俗易懂]