Rorty Flutter
入门
Rorty 中的 Flutter 干净架构是使用 Flutter、Dart 和最新技术栈展示现代、面向实践的 Flutter 应用程序开发的示例项目。
该项目的目标是展示最佳实践、提供一套指南,并展示一种模块化、可扩展、可维护且可测试的现代 Flutter 应用程序架构。这个应用程序看起来可能很简单,但它拥有所有那些微小的细节,这些细节将为适合大型团队和长期应用程序生命周期管理的更大应用程序奠定坚实的基础。
一个使用 Kotlin 构建的 Flutter 应用,它消耗 Rick and Morty API 来显示来自 电视剧 的角色、剧集和地点。它遵循了干净架构原则、存储库模式和表示层中的 MVVM 架构。
架构
对于应用的扩展来说,一个规划良好的架构至关重要,所有架构都有一个共同的目标——管理应用的复杂性。对于小型应用程序来说,这不是什么令人担忧的事情,但对于具有更长开发周期和更大团队的应用程序来说,它可能非常有用。
干净架构是由 Robert C. Martin 于 2012 年在 Clean Code Blog 中提出的,它遵循 SOLID 原则。
圆圈代表您应用程序的不同层。请注意
-
中心圆最抽象,外圆最具体。这被称为 抽象原则。抽象原则规定内部圆应包含业务逻辑,外部圆应包含实现细节。
-
干净架构的另一个原则是 依赖倒置。此规则规定每个圆只能依赖于最近的内圆,即低级模块不依赖于高级模块,反之亦然。
为什么选择干净架构?
代码之间的松耦合– 代码可以轻松修改,而不会影响应用程序代码库的任何部分或大部分,从而更容易在以后扩展应用程序。- 更易于
测试代码。 关注点分离– 不同的模块具有特定的职责,便于修改和维护。
S.O.L.I.D 原则
-
单一职责:每个软件组件应该只有一个改变的原因——一个职责。
-
开放-封闭:您应该能够扩展组件的行为,而不会破坏其用法或修改其扩展。
-
里氏替换:如果您有一个类,以及该类的任何子类,您应该能够用子类来替换基类的使用,而不会破坏应用程序。
-
接口隔离:最好有许多小的接口,而不是一个大的接口,以防止类实现它不需要的方法。
-
依赖倒置:组件应依赖于抽象而不是具体实现。此外,高级模块不应依赖于低级模块。
层
项目结构
数据层
data 层负责为 domain 层选择合适的数据源。它包含 domain 层中声明的存储库的实现。
数据层组件包括
-
model
–dto:定义 ui 模型的 dto,还执行
domain、response和entity模型之间的数据转换。–local:定义 SQLite 数据库的模式。
–remote:定义网络响应的 POJO。
-
local:负责使用 Floor 执行缓存操作。
-
remote:负责网络操作,例如使用 Retrofit/Dio 定义 API 端点。
-
repository:负责将数据暴露给 domain 层。
领域层
这是应用程序的核心层。domain 层独立于任何其他层,因此 domain 业务逻辑可以独立于其他层。这意味着其他层(例如屏幕 UI(表示层)或更改数据库(data 层))的更改不会影响 domain 层,不会导致 domain 层内的任何代码更改。
domain 层组件包括
- usecase:它们封装单个操作,例如从数据库获取数据或向服务发布数据。它们使用存储库来解决它们应该执行的操作。
表现层
presentation 层包含显示信息给用户的组件。此层的主要部分是 Views(小部件)和 ViewModels。
屏幕截图
Android
| 启动屏 | 浅色 | 黑暗 |
![]() |
![]() |
![]() |
iOS
| 启动屏 | 浅色 | 黑暗 |
![]() |
![]() |
![]() |
MacOS-Desktop
| 浅色 | 黑暗 |
![]() |
![]() |
WEB
| 浅色 | 黑暗 |
![]() |
![]() |
技术栈
该项目使用了 Flutter 生态系统中许多流行的库、插件和工具。
- Stacked – Flutter 中 MVVM 风格架构的架构和小部件。
- Provider – InheritedWidget 的包装器,使其更易于使用和更可重用。
- Get It – 依赖注入库。
- Retrofit – 一个使用 source_gen 并受 Chopper 和 Retrofit 启发的 dio 客户端生成器。
- Dio – Dart 的强大 Http 客户端,支持拦截器、FormData、请求取消、文件下载、超时等。
- Go Router – 一个基于 Navigation 2 的声明式 Flutter 路由,支持深度链接、数据驱动路由等。
- Flutter Native Splash – 使用背景颜色和启动图片自定义 Flutter 的默认白色原生启动画面。支持深色模式、全屏等。
- Shared Preferences – Flutter 读写简单键值对的插件。包装 iOS 上的 NSUserDefaults 和 Android 上的 SharedPreferences。
- Easy Localization – 轻松快速地进行 Flutter 应用的国际化和本地化。
- Url Launcher – 启动 URL 的 Flutter 插件。支持 Web、电话、短信和电子邮件方案。
- Floor – 为您的 Flutter 应用程序提供类型安全、响应式和轻量级的 SQLite 抽象。
- Logger – 小巧、易于使用且可扩展的日志记录器,可打印漂亮的日志。
代码分析工具
- Lints – 此包包含 Flutter 应用、软件包和插件的一组推荐的 lint,以鼓励良好的编码实践。
? Medium 上的文章
? 贡献指南
贡献是开源社区如此美好、激发灵感和创造的源泉。您的任何贡献都备受赞赏。
- 首先开一个 issue 来讨论您想进行的更改。
- Fork 该项目
- 创建您的功能分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add some amazing feature') - 推送到分支(
git push origin feature/amazing-feature) - 打开一个 pull request
请确保适当地更新测试。
✍️ 作者
? developersancho
随时可以 ping 我?
许可证
Copyright © 2022 - developersancho
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://apache.ac.cn/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.













