GameFlix

GameFlix

一款使用 Flutter 构建的应用,它利用 RAWG API 来展示当前、即将推出和热门的电子游戏及角色。该应用遵循了整洁架构原则、仓库模式,在表示层使用了 MVVM 架构以及 Bloc 模式。

向下滚动查看截图 ?

入门

要运行此项目,

  • 您需要在您的机器上安装 Flutter。您可以在 这里 找到安装指南。
  • 克隆此仓库
  • 要能够构建此应用程序,您需要更改 contants.dart 文件中的 API 密钥。首先,您需要通过 创建 一个 RAWG 账户并 生成 API 密钥来获取您自己的 API 密钥。
  • 运行 flutter pub get 以安装所有依赖项
  • 运行 flutter pub run build_runner build 以生成 floor 数据库的文件
  • 运行 flutter pub run flutter_launcher_icons:main && flutter pub run flutter_native_splash:create
  • 运行 flutter run 在您的设备或模拟器上运行应用程序

免责声明。

  • 像纯粹的整洁架构这样的复杂架构也会增加代码的复杂性,因为解耦您的代码也意味着创建大量的数据转换(映射器)和模型,这最终可能会增加代码的学习曲线,以至于使用更简单的架构(如 MVVM)会更好。

  • 在这个仓库中,整洁架构仅用于展示我的技能,并且不建议在像这样的小型项目中使用整洁架构。

请注意:该项目仍在开发中,您可能会遇到错误。但您仍然可以为此做出贡献。?

那么,我们开始吧……

架构

什么是整洁架构?

一个规划良好的架构对于应用程序的可扩展性至关重要,所有架构都有一个共同的目标——管理应用程序的复杂性。在小型应用程序中,这没什么好担心的,但在具有更长开发周期和更大团队的应用程序中,它可能会非常有用。

整洁架构是由 Robert C. Martin 于 2012 年在 Clean Code Blog 中提出的,它遵循 SOLID 原则。

该应用程序是基于整洁架构构建的。该架构分为 3 层

Clean Architecture

  • 数据层:此层包含所有数据源和仓库。它还包含数据模型。
  • 领域层:此层包含用例和实体。
  • 表示层:此层包含 UI 和 BLoC。

中心圆是最抽象的,外圆是最具体的。这被称为 抽象原则。抽象原则规定内部圆应包含业务逻辑,外部圆应包含实现细节。

整洁架构的另一个原则是 依赖倒置。此规则规定每个圆只能依赖于最近的内层圆,即低层模块不依赖于高层模块,反之亦然。

为什么选择整洁架构?

  • 代码之间松耦合 – 代码可以轻松修改,而不会影响应用程序代码库的任何部分或大部分,从而更易于以后扩展应用程序。
  • 更易于测试代码。
  • 关注点分离 – 不同的模块具有特定的职责,便于修改和维护。

层。

1. 领域。

这是应用程序的核心层。domain 层独立于任何其他层,因此领域模型和业务逻辑可以独立于其他层。这意味着其他层(例如屏幕 UI(表示层)或更改数据库(数据层))的更改不会对领域层产生任何影响,例如更改数据库(数据层)也不会导致领域层内的任何代码更改。

领域层的组成部分包括

  • 模型:定义应用程序中将使用的数据的核心结构。

  • 仓库:用例使用的接口。在数据层实现。

  • 用例/交互器:它们封装单个操作,例如从数据库获取数据或发布到服务。它们使用仓库来解决它们应该执行的操作。它们通常重写“invoke”运算符,因此可以像函数一样调用它们。

2. 数据。

data 层负责为领域层选择合适的数据源。它包含领域层中声明的仓库的实现。

数据层的组成部分包括

  • 模型

    Dto 模型:定义网络响应的 POJO。

    实体模型:定义 SQLite 数据库的架构。

  • 仓库:负责将数据暴露给领域层。

  • 映射器:它们执行 domaindtoentity 模型之间的数据转换。

  • 网络:负责执行网络操作,例如使用 Retrofit 定义 API 端点。

  • 缓存:负责使用 Room 执行缓存操作。

  • 数据源:负责决定在获取数据时使用哪个数据源(网络或缓存)。

3. 表示。

presentation 层包含将信息显示给用户的组件。此层包含 UI 和 BLoC。

测试

该应用程序是使用 TDD 构建的。测试分为 3 层

  • 数据层:此层包含数据源和仓库的测试。
  • 领域层:此层包含用例的测试。
  • 表示层:此层包含 BLoC 的测试。

  • flutter_bloc:Flutter 小部件,可轻松将 bloc 和 cubit 集成到 Flutter 中。
  • equatable:Equatable 是一个 Dart 包,有助于实现值相等,而无需显式覆盖 == 和 hashCode。
  • dio:Dart 的强大 Http 客户端,支持拦截器、FormData、请求取消、文件下载、超时等。
  • floor:SQLite 的持久化库,在 SQLite 之上提供了一个抽象层来定义实体及其访问器。
  • mockito:Dart 的流行模拟框架。
  • mocktail:Dart 的流行模拟框架。
  • cached_network_image:一个用于加载和缓存网络图像的 Flutter 库。
  • flutter_test:Flutter 测试支持。
  • block_test:一个测试库,可以轻松测试 bloc 和 cubit。
  • logger:一个简单的日志记录实用程序,支持多个日志级别、ANSI 颜色、行号、打印到控制台、文件和自定义输出。
  • dartz:Dart 中的函数式编程。
  • get_it:Dart 和 Flutter 项目的简单服务定位器,附带一些额外的好处。
  • flutter_native_splash:当您的应用程序启动时,原生应用程序加载 Flutter 会有一个短暂的时间。默认情况下,在此期间,原生应用程序会显示一个白色的启动屏幕。此包会自动生成 iOS、Android 和 Web 的原生代码,用于自定义此原生启动屏幕的背景颜色和启动图像。支持暗模式、全屏和特定于平台的选项。
  • flutter_launcher_icons:一个简化更新 Flutter 应用启动图标任务的包。
  • shared_preferences:用于读写简单键值对的 Flutter 插件。在 iOS 上封装 NSUserDefaults,在 Android 上封装 SharedPreferences。
  • flutter_spinkit:一组由 Flutter 动画加载指示器。深受 @tobiasahlin 的 SpinKit 启发。

屏幕截图

资源

发现错误?请提交一个问题

GitHub

查看 Github