架构推荐和资源
构建可扩展 Flutter 应用的建议。
本页介绍架构的最佳实践,以及它们的重要性,以及我们是否建议将其用于您的 Flutter 应用。您应将这些建议视为建议,而不是一成不变的规则,并应根据您的应用的独特需求进行调整。
本页上的最佳实践具有优先级,反映了 Flutter 团队的推荐程度。
- 强烈推荐: 如果您开始构建新的应用程序,则应始终实施此建议。除非这样做会与您当前的方法产生根本冲突,否则您应强烈考虑重构现有应用以实施此实践。
- 推荐: 此实践可能会改善您的应用。
- 可选: 此实践在某些情况下可以改善您的应用。
关注点分离
#您应该将您的应用分成 UI 层和数据层。在这些层中,您应该进一步将逻辑分成按职责划分的类。
| 建议 | 描述 |
|---|---|
| 使用明确定义的数据和 UI 层。 强烈推荐 |
关注点分离是最重要的架构原则。数据层将应用程序数据暴露给应用程序的其余部分,并包含应用程序的大部分业务逻辑。UI 层显示应用程序数据并监听用户的事件。UI 层包含用于 UI 逻辑和小部件的单独类。 |
| 在数据层中使用仓库模式。 强烈推荐 |
仓库模式是一种软件设计模式,它将数据访问逻辑与应用程序的其余部分隔离。它在应用程序的业务逻辑和底层数据存储机制(数据库、API、文件系统等)之间创建了一个抽象层。在实践中,这意味着创建仓库类和服务类。 |
| 在 UI 层中使用 ViewModel 和 View。(MVVM) 强烈推荐
|
关注点分离是最重要的架构原则。这种特定的分离使您的代码更不易出错,因为您的小部件保持“哑”状态。 |
使用 ChangeNotifiers 和 Listenables 来处理小部件更新。可选
|
有很多选项来处理状态管理,最终的决定取决于个人偏好。请阅读关于 我们的 ChangeNotifier 推荐 或 其他流行的选项。 |
| 不要在小部件中放置逻辑。 强烈推荐 |
逻辑应封装在 ViewModel 上的方法中。视图应包含的唯一逻辑是
|
| 使用领域层。 可选 |
只有当您的应用程序具有超出 ViewModel 范围的复杂逻辑,或者您发现自己在 ViewModel 中重复逻辑时,才需要领域层。在非常大的应用程序中,用例很有用,但在大多数应用程序中,它们会增加不必要的开销。 在具有复杂逻辑要求的应用程序中使用。 |
数据处理
#谨慎处理数据可以使您的代码更易于理解、更不易出错,并防止创建格式错误或意外的数据。
| 建议 | 描述 |
|---|---|
| 使用单向数据流。 强烈推荐 |
数据更新应仅从数据层流向 UI 层。UI 层中的交互发送到数据层进行处理。 |
使用 Commands 来处理用户交互事件。推荐
|
Commands 可以防止应用程序中的渲染错误,并标准化 UI 层将事件发送到数据层的方式。请阅读架构案例研究中的 Commands。 |
| 使用不可变数据模型。 强烈推荐 |
不可变数据对于确保必要的更改仅发生在适当的位置(通常是数据或领域层)至关重要。由于不可变对象在创建后无法修改,因此必须创建一个新实例来反映更改。此过程可防止 UI 层中的意外更新,并支持清晰的单向数据流。 |
| 使用 freezed 或 built_value 来生成不可变数据模型。 推荐
|
您可以使用软件包来帮助在数据模型中生成有用的功能,freezed 或 built_value。这些可以生成常见的模型方法,如 JSON ser/des、深度相等性检查和复制方法。如果您的模型很多,这些代码生成包可能会为您的应用程序增加大量的构建时间。 |
| 创建单独的 API 模型和领域模型。 可选 |
使用单独的模型会增加冗长性,但可以防止 ViewModel 和用例中的复杂性。 在大规模应用中使用。 |
应用结构
#组织良好的代码有利于应用程序本身和处理代码的团队。
| 建议 | 描述 |
|---|---|
| 使用依赖注入。 强烈推荐 |
依赖注入可以防止您的应用程序拥有全局可访问的对象,这使得您的代码更不易出错。我们建议您使用 provider 包来处理依赖注入。 |
| 使用 go_router 进行导航。 推荐
|
Go_router 是编写 90% Flutter 应用程序的首选方法。有一些特定的用例 go_router 无法解决,在这种情况下,您可以使用 Flutter Navigator API 直接使用或尝试在 pub.dev 上找到其他软件包。 |
| 使用类、文件和目录的标准命名约定。 推荐
|
我们建议根据它们所代表的架构组件来命名类。例如,您可能有以下类
为了清晰起见,我们不建议使用可能与 Flutter SDK 中的对象混淆的名称。例如,您应该将共享小部件放在名为 |
| 使用抽象仓库类 强烈推荐 |
仓库类是应用程序中所有数据的真相来源,并促进与外部 API 的通信。创建抽象仓库类允许您创建不同的实现,这些实现可用于不同的应用程序环境,例如“开发”和“暂存”。 |
测试
#良好的测试实践使您的应用程序具有灵活性。它也使添加新逻辑和新 UI 变得简单且风险低。
| 建议 | 描述 |
|---|---|
| 分别测试架构组件,并一起测试。 强烈推荐
|
|
| 为测试创建模拟对象(并编写利用模拟对象的代码)。 强烈推荐
|
模拟对象不像它们那样关注任何给定方法的内部工作原理,而是关注输入和输出。如果您在编写应用程序代码时牢记这一点,您将被迫编写模块化、轻量级的函数和类,这些函数和类具有明确定义的输入和输出。 |
推荐资源
#- 代码和模板
- Compass app source code - 实施这些建议的完整功能、强大的 Flutter 应用程序的源代码。
- very_good_cli - 由 Flutter 专家 Very Good Ventures 制作的 Flutter 应用程序模板。此模板生成类似的应用程序结构。
- 文档
- Very Good Engineering architecture documentation - Very Good Engineering 是 VGV 的文档站点,其中包含技术文章、演示和开源项目。它包括有关架构 Flutter 应用程序的文档。
- State Management with ChangeNotifier walkthrough - 使用 Flutter SDK 中的原语进行状态管理的简单介绍。
- 工具
- Flutter developer tools - DevTools 是用于 Dart 和 Flutter 的性能和调试工具套件。
- flutter_lints - 一个包含 Flutter 团队推荐的 Flutter 应用程序 lint 的包。使用此包来鼓励团队中的良好编码实践。
反馈
#由于本网站的这一部分正在不断发展,我们 欢迎您的反馈!