清晰架构 + Redux 状态管理的典型 Flutter 工程实现

本文最后更新于 2021年4月4日 晚上

本文主要介绍清晰架构和 Redux 状态管理在 Flutter 工程中的应用和实现.

概述

清晰架构起源于 Bob 大叔的 Clean Architecture 一书, 并很快被世界上大多数开发者接受, 且成功应用在了许多中大型项目上.

所谓清晰架构, 指的是工程中的代码有清晰的职责和层次划分. 这样便于将不变与可变的代码进行分离, 将不同职责, 不同功能的代码分布在不同的文件或模块中, 便于快速定位代码, 方便维护和后续开发. 并且通过实现一些面向对象编程的最佳实践原则(诸如 SOLID), 做到模块易于替换和扩展.

而 Redux 的概念源于 JS 世界, 它是一种新型的 APP 状态管理机制, 它是从 Flux 演变而来的. 在 Redux 的世界中, App 的状态被合并到一个状态存储中进行管理, 对状态的任何改变都通过动作来派发到状态存储中, 状态的改变又可以通过响应式编程实时反馈到 UI 上, 这样无论是从开发效率还是代码开发维护角度上来说, Redux 都是现代 APP 的一种比较合适的选择.

这里不准备展开介绍清晰架构和 Redux 的详细细节, 有兴趣的朋友可以在网上找到很多有关它们的资料.

实践记录(将不断更新调整)

下面主要讲在使用 Flutter 重新实现公司现有的一款购物 APP 产品过程中, 是如何去实现清晰架构和 Redux 状态管理的.

内部结构

包结构反映了当前工程的模块组织, 由于本工程体量不大, 故按照一般做法将包划分为如下几个:

  • 表示层: /lib/client_ui 下, 使用 Flutter Widget 系统实现.

  • 业务逻辑层: /lib/app_core 下, 纯 dart 代码实现, 不含 Widget 系统中的内容, 方便移植或重用代码, 主要是 APP 内部业务的实现.

  • 数据访问层: /lib/data_access 下, 同样是纯 dart 代码实现, 不含 Widget 系统中的内容, 放置和服务端 RESTful API 通信功能代码, 以及数据持久化功能代码.

上述三层排序层级依次降低, 下层不依赖上层, 上层依赖下层抽象而非实现, 故可以很方便地进行支撑模块替换.

下面从低到高分别说明.

数据访问层

数据访问层提供数据访问服务, 目前包括服务端通信, 数据持久化功能. 其中服务端通信主要是和服务端的 RESTful API 通信.

在服务的实现和提供上, 仍然是使用抽象类作为向上提供服务的接口, 服务实现类对象通过一个简单工厂提供. (因为服务对象没有涉及到复杂的创建过程, 也没有涉及到多种实现类, 基本上是一个接口对应一个服务实现类.)

在这层中具有和服务端正常通信时所需的全部知识, 而通信所需参数全部由上层提供, 比如登录接口需要的用户名和 RSA 加密密码. 除此以外, 这层还向上提供了一些信息更新接口, 比如每次请求都需要的公共 header 信息更新接口.

除此以外, 这层还负责和数据库进行通信, 实现数据的增删改查, 参考安卓端常用的 Repository 模式.

业务逻辑层

业务逻辑层主要实现 APP 的状态管理(通过 Redux)和 App 的业务逻辑实现, 比如本地购物车相关逻辑等.

这里详细介绍一下 Redux 和 Flutter UI 系统的结合流程.

实际上目前在工程中实现 Redux 状态管理时, 始终离不开的一个点就是去思考是否应当由 UI 直接派发动作.

如果由 UI 直接派发动作, 这样的确可以避免一些中间代码, 但存在的问题就是将一些本应由业务负责的诸如数据转换和数据验证的工作都放到了 UI 代码中去处理, 且 UI 具有过多的动作和状态相关的知识, 不利于解耦. 故实践中仍然是业务逻辑层中的代码负责派发动作, 而 UI 只调用业务逻辑层提供的接口. 这样可以完全让 Redux 的 “状态管理” 部分对 UI 透明. 不过目前这一做法在 Redux 框架中没有机制上的保障, 只能通过开发者自行约束.

而当 UI 上需要绑定 APP 状态进行展示时, 需要用到 flutter_redux 提供的 StoreBuilderStoreConnector, 这两个类的对象均可在 App 对应状态变化时触发重建相关的 Widget, 从而更新 UI.

表示层

表示层就是通过 Flutter 的 Widget 系统构造出来的, 主要职责就是实现用户界面(可见或可感的). 在它里面依赖业务逻辑层的若干接口, 同时实现 UI 和相关状态的绑定. 当用户事件或系统事件发生时, 通过调用业务逻辑接口, 从而引起数据更新, 再通过实现的数据绑定, 从而响应式地触发 UI 更新.

可以看到, 通过这样一种结构, 可以比较容易地实现易于维护, 易于测试, 易于扩展的应用.


清晰架构 + Redux 状态管理的典型 Flutter 工程实现
https://blog.rayy.top/2019/03/03/2019-50-flutter-clean-architecture-redux/
作者
貘鸣
发布于
2019年3月3日
许可协议