使用 Hilt 将存储库注入 Android 中的服务

2023-12-20

我有一个带有 Hilt 依赖注入的 Android 项目。我已经定义了MyApplication and MyModule如下。

@HiltAndroidApp
class MyApplication : Application()

@Module
@InstallIn(ApplicationComponent::class)
abstract class MyModule {
    @Binds
    @Singleton
    abstract fun bindMyRepository(
        myRepositoryImpl: MyRepositoryImpl
    ): MyRepository
}

MyRepositoryImpl实施MyRepository界面:

interface MyRepository {
    fun doSomething(): String
}

class MyRepositoryImpl
@Inject
constructor(

) : MyRepository {
    override fun doSomething() = ""
}

我现在可以注入这个实现MyRepository进入视图模型:

class MyActivityViewModel
@ViewModelInject
constructor(
    private val myRepository: MyRepository,
) : ViewModel() { }

这按预期工作。但是,如果我尝试将存储库注入到服务中,则会收到错误java.lang.Class<MyService> has no zero argument constructor:

class MyService
@Inject
constructor(
    private val myRepository: MyRepository,
): Service() { }

活动也会发生同样的错误:

class MyActivity
@Inject
constructor(
    private val myRepository: MyRepository,
) : AppCompatActivity(R.layout.my_layout) { }

我注射时做错了什么?


从有关我们如何进行操作的文档中将依赖项注入 Android 类 https://developer.android.com/training/dependency-injection/hilt-android#android-classes,我们可以了解到以下内容:

Hilt 可以为具有 @AndroidEntryPoint 注释的其他 Android 类提供依赖项。

Hilt 目前支持以下 Android 类:

  • Application(通过使用@HiltAndroidApp)
  • ViewModel(通过使用@HiltViewModel)
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver

因此,当您对任何这些 Android 类进行子类化时,您不会要求 Hilt 通过构造函数注入依赖项。相反,你用它来注释它@AndroidEntryPoint,并要求 Hilt 通过注释属性来注入其依赖项@Inject:

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 

    @Inject
    lateinit var mAdapter: SomeAdapter 

    ...

}

所以,在你的情况下你应该注射MyRepository in MyActivity and MyService像这样:

@AndroidEntryPoint
class MyService: Service() {

    @Inject
    lateinit var myRepository: MyRepository
   
    ...

}

@AndroidEntryPoint
class MyActivity: AppCompatActivity(R.layout.my_layout) { 

    @Inject
    lateinit var myRepository: MyRepository

    ...

}

并记住:

希尔特注入的场cannot be private

这就是 Hilt 支持的 Android 类。

如果您想知道 Hilt 不支持的类(例如:ContentProvider)?!我建议从本教程中学习如何操作Codelab 上的 @EntryPoint 注释 https://codelabs.developers.google.com/codelabs/android-hilt/#10(也不要忘记检查文档以了解如何在 Hilt 不支持的类中注入依赖项 https://developer.android.com/training/dependency-injection/hilt-android#not-supported).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Hilt 将存储库注入 Android 中的服务 的相关文章

随机推荐