Injecting a repository into a Service in Android using Hilt(使用HILT将存储库注入Android中的服务)
问题描述
我有一个带有Hilt依赖注入的Android项目。我已将MyApplication
和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
的此实现注入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的文档中,我们可以了解到以下内容:
Hilt可以向具有@AndroidEntryPoint批注的其他Android类提供依赖项。
Hilt目前支持以下Android类:
Application
(使用@HiltAndroidApp
)Activity
Fragment
View
Service
BroadcastReceiver
因此,当您将这些Android类中的任何一个子类化时,都不会要求Hilt通过构造函数注入依赖项。相反,您可以使用@AndroidEntryPoint
对其进行注释,并要求Hilt通过使用@Inject
注释该属性来注入其依赖项:
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
@Inject
lateinit var mAdapter: SomeAdapter
...
}
因此,在您的情况下,您应该像这样在MyActivity
和MyService
中注入MyRepository
:
@AndroidEntryPoint
class MyService: Service() {
@Inject
lateinit var myRepository: MyRepository
...
}
@AndroidEntryPoint
class MyActivity: AppCompatActivity(R.layout.my_layout) {
@Inject
lateinit var myRepository: MyRepository
...
}
并记住:
Hilt注入的字段不能为私有
Hilt支持的Android类就是这样。
如果您想知道Hilt(例如:ContentProvider
)不支持的类怎么办?!我建议您学习本教程@EntryPoint annotation on codelab(也不要忘记查看文档了解如何Inject dependencies in classes not supported by Hilt)。
这篇关于使用HILT将存储库注入Android中的服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用HILT将存储库注入Android中的服务
基础教程推荐
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01