写点什么

如何使用 BLoC 架构开发 Flutter 应用

  • 2020-12-15
  • 本文字数:3287 字

    阅读完需:约 11 分钟

如何使用BLoC架构开发Flutter应用

通过本文,你将了解什么是 Flutter 应用开发中的 BLoC 模式,它有什么好处,如何实现它,以及如何使用在真实的项目中使用它。


尽管 Flutter 还是一项相当年轻的技术,但它正在受到越来越多的欢迎。2015 年,它以 Sky 为名首次出现,2017 年,成为我们熟知和正在使用的 Flutter。Flutter 受到谷歌的支持,它允许开发人员创建感觉像本地那么漂亮而又经济的跨平台应用程序。


有许多架构,你都可以用来构建 Flutter 应用,比如:


  • Vanilla

  • InheritedWidget

  • ChangeNotifier + Provider

  • BLoC

  • MobX

  • Redux


这种开放的自由选择权可能有它的好处,但同时也可能导致命名不一致和类过于庞大的问题。在本文中,我所讨论的将是 BLoC 架构,它被许多程序员认为是 Flutter 开发的最佳选择之一。


什么是 BLoC 架构模式?


BLoC 代表业务逻辑组件,顾名思义,它是一种核心有独立组件的架构模式。BLoC 架构(将 BLoC 库集成到项目中即可使用它)是由 Felix Angelov 创建的,并于 2019 年在谷歌 I/O 中引入。


请注意,BLoC 是一种模式,其本身并不是架构。你仍然需要根据 DDD、MVVM 或 Clean 等架构来组织应用程序中的数据。


BLoC 有助于组织数据流,现在它是 Flutter 开发中最流行的模式。让我们来探究一下背后的原因。


BLoC 架构的好处


BLoC 架构有三大核心收益:


  • 简单

  • 可测试

  • 强大


为什么会这样呢?BLoC 架构允许开发人员将应用程序的不同层分离——也就是表示层和业务逻辑层。这使得在代码的不同部分可以更容易地测试和重用元素。


BLoC 架构还有助于开发人员进行状态管理,因为他们能够随时了解应用程序的状态。它还使测试更容易,因为能够更方便地为代码的特定部分编写测试。


将表示与业务逻辑分离使开发人员不仅可以在应用程序内部重用元素,甚至可以在应用程序之间重用元素。BLoC 方法的另一个优点是几个团队成员可以在一个代码库上无缝协作。因为业务逻辑是独立的,所以开发人员更容易遵循相同的模式。


BLoC 架构的主要原则是用简单的模块创建复杂的产品。如果你的项目中有一名初级开发人员,那么 BLoC 架构会使他们更容易理解底层的工作原理。即使对于有经验的开发人员,BLoC 架构也能缩短熟悉项目所需的时间。如果你正在做时间紧迫的商业开发,那这一点尤为重要。


由于这种架构将应用程序的各个部分保持得较小且独立,因此你可以轻松测试应用程序的各个方面,并非常清楚需要修复哪些问题。


此外,BLoC 架构强制在整个应用程序中只使用一个方法更改状态,使应用程序的业务逻辑是可预测的、一致的。


现在,我们已经讨论了 BLoC 架构的优点,接下来谈谈它的逻辑。


BLoC 架构是如何工作的


在深入研究 BLoC 架构的逻辑之前,让我们先了解一下它的主要概念。


  • 事件和操作 是用户与 UI 交互时的输入:例如,滑动或滚动。

  • 状态 是对这些操作的反应,它们根据用户与接口交互所发起的事件而变化。

  • BLoC 是负责业务逻辑的组件。它将事件转换为状态,并且是接收信息并随之作出响应的处理元素。

  • 是用户界面 (UI) 和 BLoC 对作出反应的异步数据流。


BLoC 架构的逻辑为:当用户通过与 UI 交互执行操作时,此操作的相关信息将发送至 BLoC 组件。然后,BLoC 组件处理和解释这些信息,并通过更改 UI 组件的状态做出响应。


如何集成 BLoC 架构


首先,你需要遵照一种架构模式组织一个 Flutter 应用程序,如 DDD, MVVM,或者 Clean。而 BLoC 架构更像是一种进一步组织应用程序中的数据流的架构。


搭建好你的架构之后,需要将 BLoC 元素集成进来。


第一步:将 BLoC 架构添加到你的项目中


若要实现 BLoC 架构,你需要将 BLoC 库集成到你的项目中。为此,需要将 flutter_bloc: ^2.0.1 依赖项添加到 pubspec.yaml 文件中。恭喜!现在你有一个 Flutter 包了,你可以实现 BLoC 模式了。


第二步:在 BLoC 库中设置小部件


BLoC 库中有三个主要的小部件:


  • Bloc

  • BlocBuilder

  • BlocProvider


你需要它们来创建 BLoCs,根据应用程序状态的变化构建 BLoCs,以及设置依赖关系。让我们看看如何实现每个小部件,并在应用程序的业务逻辑中使用它。


Bloc


Bloc 小部件是实现所有业务逻辑所需的基本组件。若要使用它,需要扩展 BLoC 类并覆盖 mapEventToStateinitialState 方法。


mapEventToState 中,需要处理表示操作的参数。在此之后,需要将每个参数作为状态返回。参见以下示例:


Dartenum CounterEvent { increment, decrement } class CounterBloc extends Bloc { @override int get initialState => 0; @override Stream mapEventToState(CounterEvent event) async* { switch (event) { case CounterEvent.decrement: yield state - 1; break; case CounterEvent.increment: yield state + 1; break; } } }
复制代码


如你所见,其中接获了 CounterEvent,并根据事件类型对其进行处理,然后返回状态 (本例是一个 int 数据)。


如果你想定制响应,可以创建一个抽象的状态或事件:


Dart//Customized state @immutable abstract class IncomingState {} class InitialIncomingState extends IncomingState {} class HandledState extends IncomingState { final int counter; HandledState(this.counter); }@immutable abstract class IncomingEvent {} class IncrementEvent extends IncomingEvent { IncrementEvent(); }class DecrementEvent extends IncomingEvent { DecrementEvent(); }
复制代码


BlocBuilder


BlocBuilder 是一个通过构建 BLoCs 来响应新状态的小部件。这个小部件可以被多次调用,它的作用类似于一个通过创建小部件来响应状态变化,随后显示为新的 UI 元素的函数。


要获得一个不会通过 BlocProvider 和 BuildContext 访问的作为单个小部件的 BLoCs,你需要做如下指定:


DartBlocBuilder( bloc: blocA, // provide the local bloc instance builder: (context, state) { // return widget here based on the state of BlocA} )
复制代码


如你所见,需要在 Bloc 参数中提供一个扩展的 Bloc 类。你的状态类实例将出现在 BlocBuilder 中。请记住,一开始的状态是之前在 initialState 方法中创建的状态。


为了避免内存泄漏,在创建 BlocBulider 类时不应该创建 Bloc 类的实例。否则,你将无法在 Bloc 类中关闭流。我的建议是在 initState 方法中创建一个 Bloc 实例,然后在 dispose 方法中使用 block.close() 关闭它。


BlocProvider


这个小部件作为依赖项注入进行工作,也就是说它可以一次为属于同一子树的几个小部件提供 BLoCs。BlocProvider 用于构建子树中所有小部件均可使用的 BLoCs。而且因为这些 BLoCs 是由 BlocProvider 构建的,所以它也能够关闭它们。


DartBlocProvider( builder: (BuildContext context) => BlocA(), child: ChildA(), );
复制代码


注意,你还可以使用 BlocProvider 提供一个带有新小部件树的 BLoC 。你可以通过这种方式扩展现有 BLoC 的能力,而不是创建一个新的 BLoC 。但是,如果这样做,BlocProvider 无法关闭该 BLoC ,因为这不是它创建的。


第三步:创建一个事件


若要对数据执行任何操作(处理它、通过网络发送它、将它保存到数据库),则需要在你的 Bloc 组件中创建一个事件。为此,你只需要调用以下方法:


Dartbloc.add(YourEvent());
复制代码


就这么简单!现在,BLoC 组件能够处理你的事件了。


如你所见,使用 BLoC 库搭建你的 BLoC 架构模式 非常容易。


结语


BLoC 模式是加强和组织你的 Flutter 应用的架构的最佳方式之一。它易于搭建和使用,并且使你的代码具有可预测性,且易于测试。


要在你的 Flutter 应用程序中实现 BLoC 模式,只需集成 BLoC 库,然后创建和设置必要的小部件,由这些小部件执行你的应用程序的业务逻辑和行为。最后,使用事件来操作应用程序中的数据,并将操作和结果连接起来。


我对任何 Flutter 项目都推荐 BLoC 架构,因为它使代码可维护,并帮助你摆脱样板和意大利面式的代码,使你应用程序的每个部分保持独立、便于组织。


原文链接:


https://dzone.com/articles/how-to-develop-your-flutter-app-with-the-bloc-arch


译者简介


冬雨,小小技术宅一枚,从事研发过程改进及质量改进方面的工作,关注编程、软件工程、敏捷、DevOps、云计算等领域,非常乐意将国外新鲜的 IT 资讯和深度技术文章翻译分享给大家,已翻译出版《深入敏捷测试》、《持续交付实战》。


2020-12-15 17:173006

评论

发布
暂无评论
发现更多内容

飞桨EasyDL月刊:4月功能全新升级,模型训练步骤缩短63%

飞桨PaddlePaddle

飞桨 EasyDL

VictoriaMetrics常见性能问题排查

天翼云开发者社区

vm 架构设计

专访高雪峰:从GPT3.5到4,超强推理能力的实现与“图”密不可分 | 36氪专访

Fabarta

人工智能 AI 图计算 图智能

Footprint Analytics 与 Oasys 建立合作关系, 用数据帮助项目方提升游戏开发体验

Footprint Analytics

区块链 Footprint Analytics

openEuler 成功适配 LeapFive InFive Poros 开发板

openEuler

Linux 操作系统 openEuler 开发板 risc-v

低代码开发平台 重塑数字医疗生产力

力软低代码开发平台

20 分钟搭建互动教室,实现多人实时互动白板协作丨RTE 开发实战课 • 第三期

声网

IPv6 无状态地址如何自动配置?

天翼云开发者社区

IP 网络

行业实践专栏上线|互娱领域专家解读 Flink 企业应用实践

Apache Flink

大数据 flink 实时计算

一文看懂THD布局要求

华秋PCB

PCB 布局 PCB设计 布线 波峰焊

Amazon EKS 上有状态服务启用存储加密

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

YMatrix 5.0 故障自动转移功能新实现,运维更方便!

YMatrix 超融合数据库

数据库 时序数据库 超融合数据库 YMatrix

NUMA架构介绍及优缺点分析

天翼云开发者社区

架构设计 NUMA

NFTScan:05.08~05.14 NFT 市场热点汇总

NFT Research

NFT

共铸国云 智领未来 | 化云为雨 泽被万物

天翼云开发者社区

云计算 网络

龙蜥产品生态总监做客 InfoQ:后 CentOS 时代,国产操作系统能否扛起大旗?

OpenAnolis小助手

centos InfoQ 迁移 国产操作系统 龙蜥社区

创建各种类型的3D模型:Rhino 7中文激活版

真大的脸盆

Mac Mac 软件 三维建模 建模软件 3d建模

共享电动车制造的厂家有哪些?要注意什么

共享电单车厂家

共享电动车厂家 共享电单车生产 共享电动车制造 本铯电动车厂家

如何简单快捷的使用上ChatGPT?

Ricky

人工智能 openai ChatGPT

一周狂赚50万,GPT-4帮你在线“脱单”,AI女友按分钟收费,男友高达数量1000+

加入高科技仿生人

人工智能 AI 低代码 ChatGPT GPT-4

声网自研编码器 a264 & a265:更优画质更低能耗,进一步适配实时互动场景需求

声网

浅谈TCP、UDP、ICMP三种常见协议

天翼云开发者社区

网络传输协议

AI低代码,或将再次颠覆开发行业

引迈信息

低代码 AIGC JNPF AI低代码

明道云开放日上海站开启报名

明道云

山东移动:全业务域核心系统升级,实现大幅降本增效

OceanBase 数据库

数据库 oceanbase

远程桌面连接可以传文件么?

RayLink远程工具

远程桌面连接

一图看懂一体化数据安全平台 uDSP

原点安全

数据治理 数据安全 数据安全法 信息泄露 个人信息安全

MySQL的varchar存储原理:InnoDB记录存储结构

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

4 月 NFT 月报: 在动荡的 NFT 市场中寻求生存

Footprint Analytics

区块链游戏 NFT 链游

Footprint Analytics、Oasys L2 区块链和 HOME Verse 联手推动区块链游戏基础设施创新

Footprint Analytics

MobTech MobPush|助力预热618

MobTech袤博科技

如何使用BLoC架构开发Flutter应用_大前端_Svetlana Cherednichenko_InfoQ精选文章