如何在 Android 的动态功能模块中使用 Dagger?
在我们之前的文章中,我们学习了如何在具有多模块架构的 Android 项目中设置 Dagger。单击此处查看我们如何在多模块架构中使用 Dagger。我们将扩展我们在之前项目中所做的项目。但首先,我们必须学习如何创建和配置动态功能模块。单击此处了解如何操作。让我们先快速回顾一下。
动态功能模块到底是什么?
它与 Android 中的任何其他模块类似,只是它必须与模块分离。它带有应用程序包,允许用户根据需要下载或删除模块。那么,让我们开始吧。
第 1 步:首先,在项目中,我将创建一个动态功能模块:
转到File-> 然后单击New -> Tap , New Module 并选择 Dynamic Feature Module 然后将其命名为:
featureThree
第2步:之后,我们将添加
android {
....
dynamicFeatures = [":featureThree"]
}
在应用程序的 build.gradle 文件中。在 featureThree 的 build.gradle 中,我们将包含 app、base 和 dagger 依赖项,例如,
implementation project(':app')
implementation project(':base')
implementation "com.google.dagger:dagger:2.26"
kapt "com.google.dagger:dagger-compiler:2.26"
第 3 步:新模块
在 featureThree 模块中,我们现在将创建一个名为 FeatureThreeActivity 的活动。现在,我们所要做的就是执行一些基本步骤来让我们的工作付诸实施。我们是否会在组件包中包含 FeatureThreeComponent 并更新代码如下?
Kotlin
@FeatureThreeScope
@Component(
dependencies = [BaseComponent::class],
modules = [FeatureThreeModule::class]
)
interface GeeksComponent {
fun inject(activity: FeatureThreeActivity)
}
Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.gfgMainActivity)
DaggerFeatureThreeComponent
.builder()
.baseComponent(InjectUtils.provideBaseComponent(applicationContext))
.build()
.inject(this)
}
Kotlin
class ThirdFeatureActivity : AppCompatActivity() {
@Inject
lateinit var aDatabaseServer: DatabaseService
@Inject
lateinit var someNetworkService: NetworkService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.gfgMainActivity)
DaggerFeatureThreeComponent
.builder()
.baseComponent(InjectUtils.provideBaseComponent(applicationContext))
.build()
.inject(this)
Log.d("Geeks for Geeks \n Spandan Saxena", databaseService.toString())
}
}
Kotlin
val toMainIntent = Intent().setClassName(this, "com.geeksforgeeks.sample.feature.three.FeatureThreeActivity")
startActivity(toMainIntent)
现在,在模块包中,我们将创建 FeatureThreeModule。
@Module
class FeatureThreeModule {
}
第 4 步:最后,我们将更新 FeatureThreeActivity 代码以实现 FeatureThreeComponent,如下所示。
科特林
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.gfgMainActivity)
DaggerFeatureThreeComponent
.builder()
.baseComponent(InjectUtils.provideBaseComponent(applicationContext))
.build()
.inject(this)
}
我们没有创建一个新实例,而是将一些重要信息从这里传递到那里,以简化复杂性。点击这里可以找到更多信息。
第 5 步:检查和打勾
我们现在将 DatabaseService 和 NetworkService 注入 FeatureThreeActivity 并更新活动的代码如下:
科特林
class ThirdFeatureActivity : AppCompatActivity() {
@Inject
lateinit var aDatabaseServer: DatabaseService
@Inject
lateinit var someNetworkService: NetworkService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.gfgMainActivity)
DaggerFeatureThreeComponent
.builder()
.baseComponent(InjectUtils.provideBaseComponent(applicationContext))
.build()
.inject(this)
Log.d("Geeks for Geeks \n Spandan Saxena", databaseService.toString())
}
}
我们已经完成了这个模块的匕首配置。现在我们必须确定在动态特征模块中匕首的实现是否成功。因此,我们将验证 MainActivity 和 FeatureThreeActivity 中的 DatabaseService 和 NetworkService 注入接收到相同的内存分配。我们将使用添加到活动文件中的 Log 语句对其进行测试。现在,我们将更新 MainActivity 的 onCreate()函数中的代码以使用以下方法打开 FeatureThreeActivity,
科特林
val toMainIntent = Intent().setClassName(this, "com.geeksforgeeks.sample.feature.three.FeatureThreeActivity")
startActivity(toMainIntent)
结论
因此,如您所见,我们在多个模块中为数据库服务分配了相同的内存。因此,这就是匕首可以在动态功能模块中使用的方式。