现在继续前进,并将学习如何使用BLoC模式来构造flutter项目。
如何设计一个应用程序的结构是在应用程序的开发中出现的讨论最多的问题之一?
每个人似乎都有他最喜欢的架构模式,其缩写为幻想。iOS和Android开发者都知道模型-视图-控制器(MVC),并在构建应用程序时将这种模式作为默认选择。
模型和视图是分割的,控制器互相发送信号。但是Flutter带来了一种新的响应式风格,与MVC不完全兼容。
这个经典模型的一个变种已经被引入Flutter社区。BLoC。BLoC标志着业务逻辑组件。BLoC的本质是,应用程序中的一切都应该被描绘成一个事件流。BLoC站在中间,管理着对话。
核心概念
流是BLoC的基础,你必须熟悉这个概念。
流提供了接收一连串事件的方法。每个事件要么是一个数据事件,被称为流的一个元素,要么是一个错误事件,是一个有关失败的通知。
接收流事件
一个Stream可以用多种方式创建,并以同样的方式使用:异步循环,通常被称为在Stream中等待事件的迭代,就像在Iterable上迭代的循环。
要想了解更多,请看下面的例子。

那么,你看到流在BLoC中的帮助了吗?
你需要应用内的交互来监听新出现的状态,而BLoC可以做到这一点。
Cubit和BLoC
Cubit和BLoC是我们需要了解的两个最重要和最需要的概念。

看完图片后,你心中的疑问是这两者是否相同。立方体是BLoC的一个旧版本,或者我们可以说BLoC是立方体的延伸。
cubit是一种与用户界面有关的特殊类型的流组件,它发射状态并重建用户界面。
但当我们把它与BLoC相比较时,cubit并不是一个流组件。我们可以说它持有一个带有状态的空流。
现在你可能会问我,为什么我们需要使用BLoC?cubit还不够吗?那么请记住,cubit不是流的一部分,它只包括基于组件的,但它发射状态并修改用户界面。另一方面,BLoC发射状态并接收事件流。
这就是为什么BLoC是复杂和高级应用程序的大脑。
Flutter BLoC的概念
你知道flutter中的一切都有一个UI组件和小部件。而我们需要使用BLoC来实现UI,所以我们中的许多人认为我们需要为每个widget添加BLoC。
Wrong....
你不需要为每个小部件添加BLoC。
BLoC提供者
BLoC提供者是一个单一的浮动小部件,它为其所有的子小部件提供BLOC。
我们可以称它为依赖性注入部件。它有一个单一的实例,并提供给多个部件,就像一个树状结构。
请看下面的例子,它显示了我们如何实例化BLoCProvider。
class FilesPage extends StatelessWidget {
const FilesPage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => FilesCubit(),
child:Center(
child:Text(“Center”));,
);
}
}
}
使用上面的代码,你可以向FilePage类的小部件提供BLoC,filesCubit将发出状态并接收各自组件的流。
所以,这就是提供BLoC,但如何构建它来接收它或将它分配给widgets呢。
现在,向你介绍BLoC的第二个组件
BLoC生成器
BLoC构建器可以帮助你重建状态变化的UI。这个神奇的组件可以帮助你重建用户界面,无论是cubit还是BLoC发出的状态。
在应用程序中重建大量的代码需要大量的时间,所以你可以使用BLoC并将你的小部件包裹在其中。
BLoC builder在重建widgets时需要bloc和cubit。而且构建器返回的小部件具有响应的状态。
比如说
class MobileFilesScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<FilesCubit, FilesState>(builder: (context, state) {
Return Center(
child:Text(“Center”));
}
你可以看到上面的例子在重建UI时返回FilesCubit和FilesState。
如果你想尝试,你应该在你的pubspec.yaml中添加以下包

结论
对于你的结构化代码,BLoC模式是使你成为一个好的编码者和优化应用程序的最佳实践。
必须尝试!