本文介绍了使用HILT将存储库注入Android中的服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有Hilt依赖注入的Android项目。我已将MyApplicationMyModule定义如下。

@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的此实现注入ViewModel:

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) { }

我的注射做错了什么?

推荐答案

从有关我们如何Inject dependencies into Android classes的文档中,我们可以了解到以下内容:

因此,当您将这些Android类中的任何一个子类化时,都不会要求Hilt通过构造函数注入依赖项。相反,您可以使用@AndroidEntryPoint对其进行注释,并要求Hilt通过使用@Inject注释该属性来注入其依赖项:

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {

    @Inject
    lateinit var mAdapter: SomeAdapter

    ...

}

因此,在您的情况下,您应该像这样在MyActivityMyService中注入MyRepository

@AndroidEntryPoint
class MyService: Service() {

    @Inject
    lateinit var myRepository: MyRepository

    ...

}

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

    @Inject
    lateinit var myRepository: MyRepository

    ...

}

并记住:

Hilt支持的Android类就是这样。

如果您想知道Hilt(例如:ContentProvider)不支持的类怎么办?!我建议您学习本教程@EntryPoint annotation on codelab(也不要忘记查看文档了解如何Inject dependencies in classes not supported by Hilt)。

这篇关于使用HILT将存储库注入Android中的服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-19 00:26