Flutter架构解析:基于states_rebuilder的TodoMVC实现
前言
在Flutter应用开发中,状态管理一直是核心话题之一。本文将深入分析一个基于states_rebuilder状态管理库实现的TodoMVC应用架构,帮助开发者理解如何构建清晰、可维护的Flutter应用。
项目概述
这是一个使用states_rebuilder作为状态管理方案的TodoMVC应用实现。TodoMVC是一个经典的待办事项应用,常被用来展示不同框架或状态管理方案的实现方式。
架构设计
分层架构
项目采用洋葱圈分层架构,分为三个主要层次:
-
领域层(Domain) - 最内层
- 包含实体(Entities)和领域异常(Exceptions)
- 在TodoMVC中只有一个
Todo实体 - 实体是可变对象,具有唯一ID
- 实体包含自身所有业务逻辑
- 验证逻辑在持久化前执行(如toMap()方法中)
-
服务层(Service) - 中间层
- 包含应用服务用例的业务逻辑
- 定义供外层(UI和基础设施)使用的API接口
- 数据源(DataSource)需要实现这些接口
-
外层 - 最外层
- 包含UI、数据源(DataSource)和基础设施
- 负责具体实现和用户界面展示
目录结构
lib
├── domain
│ ├── entities
│ └── exceptions
├── service
│ ├── interfaces
│ ├── exceptions
│ └── common
├── data_source
└── ui
├── pages
├── exceptions
└── common
领域层和服务层是应用的核心可移植部分,不依赖任何具体的外部服务实现,可以在不同的UI框架间共享。
states_rebuilder核心概念
1. 清晰的关注点分离
states_rebuilder实现了UI与业务逻辑的彻底分离。业务逻辑由纯Dart类构成,无需继承或引用任何外部包:
class Foo {
// 纯Dart类
// 不继承外部库
// 不使用通知机制
// 不使用注解
}
2. 依赖注入机制
使用Injector组件将业务逻辑类注入到widget树中:
Injector(
inject: [Inject(() => Foo())],
builder: (context) => MyChildWidget()
)
Injector是一个StatefulWidget,可以在widget树的任何位置使用。
3. 获取注入实例
从Injector的子widget中,可以通过以下方式获取注册的实例:
- 获取原始单例:
final Foo foo = Injector.get<Foo>();
- 获取响应式包装的单例:
final ReactiveModel<Foo> foo = Injector.getAsReactive<Foo>();
实际上,对于每个注入的模型,states_rebuilder会注册两个单例:
- 模型的原始单例
- 模型的响应式单例 - 原始单例被包装在一个响应式环境中
响应式环境添加了getter、字段和方法来:
- 修改状态
- 跟踪响应式环境的状态
- 通知订阅了该状态的widget
4. 状态订阅机制
要让widget订阅状态变化,可以使用:
StateBuilder组件- 或者在
Injector.getAsReactive<Foo>(context:context)中传入context参数
5. 状态更新机制
setState方法是定义状态变更和发送通知的地方。工作流程如下:
- 在UI中调用
setState来变更状态 - 状态变更后通知订阅的widget
- 可以在
setState中定义副作用回调:onSetState:状态变更后、widget重建前执行onData/onError:处理数据或错误onRebuild:widget重建后执行
在onSetState中,可以再次调用setState来变更状态并通知UI,形成链式调用。
最佳实践
- 领域驱动设计:将核心业务逻辑放在领域层,保持其纯净性
- 接口隔离:服务层定义接口,由外层实现具体细节
- 响应式编程:利用states_rebuilder的响应式特性简化状态管理
- 异常处理:在各层定义专门的异常类型,实现精细化的错误处理
总结
通过states_rebuilder实现TodoMVC应用,我们看到了一个清晰的分层架构和响应式状态管理的优秀实践。这种架构不仅保持了业务逻辑的纯净性,还通过响应式编程简化了UI与状态的同步问题,为构建可维护、可测试的Flutter应用提供了良好范例。
对于想要深入理解Flutter状态管理和应用架构的开发者,这个实现方案值得仔细研究和借鉴。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



