📜  如何在 Android 的动态功能模块中使用 Dagger?

📅  最后修改于: 2022-05-13 01:58:44.882000             🧑  作者: Mango

如何在 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)

结论

因此,如您所见,我们在多个模块中为数据库服务分配了相同的内存。因此,这就是匕首可以在动态功能模块中使用的方式。