在下面的教程中,我们将使用 Bloc 库在 Flutter 中构建一个计数器。
我们从创建一个全新的 Flutter 项目开始
用下面的代码替换 pubspec.yaml
的内容:
然后安装所有的依赖
这个应用采用了功能驱动的目录结构。这种项目结构以便于我们按照独立的功能对项目进行扩展。这个示例项目里只有一个功能(计数器),但是在更加复杂的应用里我们可以包含数以百计的功能。
我们要做的第一件事是看看如何创建一个 BlocObserver
来观察应用里所有的状态变更。
我们先创建一个 lib/counter_observer.dart
:
目前,我们仅重写了 onChange
来查看所有发生的状态变更。
下一步,我们替换 lib/main.dart
的代码如下:
我们初始化了我们创建的 CounterObserver
并且在 runApp
里添加了 CounterApp
组件。
创建一个 lib/app.dart
:
CounterApp
是一个 MaterialApp
并且指定了 CounterPage
作为主页。
接下来咱们看看 CounterPage
!
创建 lib/counter/view/counter_page.dart
如下:
CounterPage
部件负责创建 CounterCubit
(下面会讲到)并且提供给 CounterView
。
创建 lib/counter/cubit/counter_cubit.dart
如下:
CounterCubit
会公开以下方法:
increment
: 当前状态 +1
decrement
: 当前状态 -1
CounterCubit
管理的是 int
型的状态,初始值为 0
。
接下来,我们看看负责消费并且与 CounterCubit
进行交互的 CounterView
。
创建 lib/counter/view/counter_view.dart
如下:
CounterView
负责渲染当前的数值,以及两个 FloatingActionButtons 来负责增/减计数。
BlocBuilder
用来包装 Text
部件,这样 CounterCubit
任何的状态变化都会更新文本。此外, context.read<CounterCubit>()
用于查找最近的 CounterCubit
实例。
创建 lib/counter/view/view.dart
:
添加 view.dart
来导出所有 counter 视图的公共部分。
创建 lib/counter/counter.dart
:
添加 counter.dart
来导出 counter 功能的所有公共部分。
以上就是全部!我们将业务逻辑层从展现层种分离了出来。 CounterView
不知道用户按下按钮以后会发生什么;它只是通知 CounterCubit
。此外,CounterCubit
也不知道状态(计数器的值)发生了什么;它只是响应调用的方法发出新状态。
我们可以运行 flutter run
来在设备或者模拟器上查看运行的效果。
可以在 这里 找到这个例子的完整代码(包括单元和部件测试)。