Flutter Clean Architecture 实践(7)

OldBird

实用Tips|2024-11-26|Last edited: 2024-11-26|
type
status
date
slug
summary
tags
category
icon
password
在上一篇文章中,我们在User的Domain Layer中做了一些工作,我们创建了一个contract类,目前只包含User方法,我们还创建了UserEntity并理解了一些概念,并为Repository中的每个方法创建了单独的用例。现在让我们来执行它们。
<ins/>
首先,你必须为你的项目设置你的Firebase,因为我们将在一段时间内使用它,这是重要的一步。
 

Firebase Setup

 
转到>浏览器>搜索firebase控制台打开第一个选项卡或名为Firebase控制台的选项卡,您将看到以下内容:
 
notion image
 
选择Add project,Name your project,Enable Firebase Analytics,然后选择default account。在此之后,您将看到您的Firebase项目已创建,并准备将其与Flutter应用程序链接
 
notion image
 
 
步骤1:现在去Android,然后另一个窗口将出现在你面前.
 
notion image
 
现在转到Android Studio或编辑器中的flutter项目,搜索Android目录,它通常位于lib目录的上方。打开它并转到 > android > app 并打开 build.grade
 
注意:我们有两个构建。等级文件在我们的项目上是应用程序级,其他是项目级。
 
位于应用程序目录中的应用程序是应用程序级的,因此单击此选项并滚动一点,您将在defaultConfig{ } 中看到您的 applicationId,如下图所示。
 
notion image
 
复制 applicationId 并转到您的浏览器并将其粘贴在第一个字段中,然后如果您想为应用程序提供昵称,则其可选,暂时忘记SHA,我们稍后会查找它。
 
<ins/>
 
点击注册应用程序按钮并继续。
 
第二步:你会看到这个窗口在你面前。
 
notion image
 
下载google-servies.json文件并将其从下载移动到您的项目> android > app,如上图所示。
 
这个json文件包含了你创建的android应用的详细信息,你可以打开它来检查。
 
第3步:在这一步中,你会看到一些代码,是必不可少的Android设置.
 
复制此类路径并转到> android >,正如您在上面的注释中所看到的,我们有两个build.gradle文件,一个是应用程序级,另一个是项目级,因此您需要将此类路径粘贴到依赖项{ }内项目级build.gradle中。
 
notion image
 
这就是项目级构建的情况。gradle现在复制以下代码:
 
apply plugin: ‘com.google.gms.google-services’
 
并转到 android > app > build.gradle 内的 App-Level build.gradle 文件,并将其与其他插件一起粘贴。
 
notion image
 
您几乎完成了设置。
 
再次转到 Next(下一步)和 Continue to console(继续到控制台
 
现在,在你的 main.dart 中初始化 Firebase 并运行你的应用。
 
notion image
 
对于 Firebase.initializeApp(),你需要在 pubspec.yaml 文件中添加firebase_core包。
 
恭喜🎉您已成功为您的应用程序设置 firebase。
 

Data Layer (Repository Implementation)

 
现在让我们开始数据层转到 > data > repository > 并创建 dart 文件 firebase_repository_impl.dart
 
我们将实现我们的 FirebaseRepository(合约)
 
创建一个类并将其命名为 FirebaseRepostioryImpl,然后使用 FirebaseRepository 类实现它。
 
 
使用 FirebaseRepositoryImpl 实现 FirebaseRepository 后,您将在类名中看到编译时错误。
 
按 Alt + Enter 键,将出现一个包含 9 个缺失覆盖的小窗口,选择此窗口并按 Enter
 
您将看到类似于以下代码的结果:
 
 
FirebaseRepostiory (contract) 类中将包含所有方法,但现在它们似乎都抛出 UnimplementedError()。
 
现在很明显,这个 FirebaseRepositoryImpl 将从某种数据源获取数据(因此我们在数据层中有名为 data_sources 的目录)。
 
所以在 data_sources 目录下创建一个新目录并将其命名为 remote_data_sources并在其中创建一个 dart 文件 remote_data_source.dart
 
现在将有一个类似于 FirebaseRepository(合约)类的类,只是它的名称会有所不同,看看下面的代码。
 
remote_data_source.dart
 
 
由于我们在域层的 Repository(合约)在数据层中有 RepositoryImpl,所以这个 FirebaseRemoteDataSource 也是一个合约,它的实现会在同一个目录下,所以在data > data_sources > remote_data_sources > remote_data_source_impl 中创建一个文件,暂时留空,我们稍后再来。
 
notion image
 
现在是时候实施我们的 FirebaseRepository 了。转到 > data > repository > 并打开 firebase_repository.dart 文件。
 
 
获取 FirebaseRepositoryImpl 类中的 FirebaseRemoteDataSource 类的实例,并将其传入构造函数中并使其成为必需的。
 
 
现在,从所有方法中远程执行 UnImplemented 错误,并为所有方法调用特定方法,如下面的代码所示:
 
 
这是两个覆盖方法:我删除了 { } 主体,并将它们设为箭头函数 async,因为此方法是 Future,并从 remoteDataSource 实例调用方法,如上面的代码所示。
 
注意:我们也有 Stream 方法,即 getSingleUser 和 getUsers,因此请避免将 async 放在那里,否则会引发编译时错误。
 

Models

 
这些模型将存储在我们的 Cloud Firestore 数据库中。您可能会有疑问,为什么我们有模型和实体,我们可以只有模型或只有实体。
 
:我们需要保持 Domain Layer 完全独立,它不会与任何类型的第三方打交道,这就是我们在 Data Layer 中创建实体(Domain Layer)和模型的原因。
 
这样,模型将进行一些转换,就像我们的例子中 fromSnapshot() 和 toJson() 一样。
 
我们的用户模型将类似于下面的代码
 
user_model.dart
 
如前所述,我们在用户模型中没有 password 和 otherUid。
 

Data Layer (Remote Data Source Impl)

 
我们已经实现了我们的 FirebaseRepository 并为我们的用户创建了模型,因此我们还创建了一个抽象类,即 FirebaseRemoteDataSource,我们从中获取数据,而实现 FirebaseRepository 是而不是自己实现的。
 
转到数据 data > data_sources > remote_data_sources >,打开 remote_data_source_impl dart 文件。
 
正如我们对 FirebaseRepositoryImpl 所做的那样,我们从 Impl 类中实现抽象类,FirebaseRemoteDataSource 也是如此。
 
创建一个类并使用 FirebaseRemoteDataSource 实现它,您将再次在类中看到编译时错误,按 Alt + Enter 键并选择 9 个缺失的覆盖,然后按 Enter
 
正如我们在 FirebaseRepository Implementation 中看到的那样,将会出现未实现的方法。
 
现在实现这些方法:
 
remote_data_source_impl.dart
 
 
如果您对 FirebaseConst.users 和 toast 消息感到困惑,请转到 lib > consts.dart 并在其中添加以下代码。
 
这些基本上是我们将要一次又一次使用的常量,所以我们不想对它们进行硬编码,因此我们为它们创建了常量。
 
 

结论

 
最后,这是一篇如此长的文章,我们已经完成了用户的remote_data_source_impl。在下一篇文章中,我们将介绍 Cubit(状态管理解决方案)。
 
Loading...