android - 如何将存储库添加到 Dagger Room 模块?
问题描述
如何将存储库添加到 Dagger Room 模块?当我尝试将此类添加到模块时,我的存储库使用应用程序出现错误。如何在 Dagger 中正确嵌入这个存储库,以便稍后我可以在我的 ViewModel 类中进行注入?为什么前两个功能通常在 Room Module 中实现,而最后一个没有。任何帮助我的存储库:
class ContactRepository (application: Application) {
private var contactDao: ContactDao
private var allContacts: MutableLiveData<ArrayList<Contact>>
companion object {
@Volatile
private var INSTANCE: ContactRepository? = null
fun getInstance(application: Application): ContactRepository {
return INSTANCE ?: getInstance(application)
}
}
init {
val database: ContactDatabase? = ContactDatabase.getInstance(application.applicationContext)
contactDao = database!!.contactDao()
allContacts = contactDao.getAllContact()
}
fun insert(contact: Contact) {
InsertContactAsyncTask().execute(contact)
}
fun updateAll(contactsModel: List<ContactsModel>) {
}
fun update(contact: Contact) {
}
fun delete(contact: Contact) {
}
fun getAllContact(): MutableLiveData<ArrayList<Contact>> {
return allContacts
}
class InsertContactAsyncTask : AsyncTask<Contact, Unit, Unit>() {
private val contactDao: ContactDao? = null
override fun doInBackground(vararg param: Contact) {
contactDao?.insert(param[0])
}
}
}
RoomModule:
@Module
class RoomModule {
private lateinit var contactDatabase: ContactDatabase
fun RoomModule(application: Application) {
contactDatabase = Room.databaseBuilder<ContactDatabase>(application, ContactDatabase::class.java, "contact_database")
.build()
}
@Singleton
@Provides
fun providesRoomDatabase(): ContactDatabase {
return contactDatabase
}
@Singleton
@Provides
fun providesContactDao(contactDatabase: ContactDatabase): ContactDao {
return contactDatabase.contactDao()
}
@Provides
fun providesContactRepository(application: Application): ContactRepository {
return ContactRepository(application)
}
}
例外:
public abstract interface ApplicationComponent {
^
android.app.Application is injected at com.infernal93.phonebookappmvvmanddagger.di.modules.RoomModule.providesContactRepository(application)
com.infernal93.phonebookappmvvmanddagger.room.ContactRepository is injected at
com.infernal93.phonebookappmvvmanddagger.viewmodels.ContactsViewModel(contactRepository)
com.infernal93.phonebookappmvvmanddagger.viewmodels.ContactsViewModel is injected at
com.infernal93.phonebookappmvvmanddagger.di.modules.ViewModelModule.bindViewModel(viewModel)
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
com.infernal93.phonebookappmvvmanddagger.viewmodels.ViewModelFactory(viewModelsMap)
应用组件:
@Singleton
@Component(modules = [ContextModule::class, NetworkModule::class, RoomModule::class])
interface ApplicationComponent {
fun inject(activity: ContactListActivity)
fun inject(activity: AddContactActivity)
fun inject(app: Application)
}
视图节点:
class ContactsViewModel @Inject constructor(private val contactRepository: ContactRepository) : ViewModel() {
fun getAllContacts(): MutableLiveData<ArrayList<Contact>>{
val contacts = contactRepository.getAllContact()
return contacts
}
解决方案
@Singleton
@Component(modules = [ContextModule::class, NetworkModule::class, RoomModule::class])
interface ApplicationComponent {
fun inject(app: App)
fun inject(activity: ContactListActivity)
fun inject(activity: AddContactActivity)
fun inject(viewModel: ContactsViewModel)
fun inject(apiRepository: ApiRepository)
// For fix Room compile bugs
fun contactDatabase(): ContactDatabase
fun contactDao(): ContactDao
fun contactRepository(): RoomRepository
}
推荐阅读
- c - 为什么 gcc 会生成 ARM 程序集,它将全局数据的地址放在标签中并在每个函数中重复
- python-3.x - TypeError:“int”类型的参数在索引中不可迭代
- python - 寻找 SumKSmallest 的算法
- python - 如何为 SVM 机器学习算法转换字符串数据
- snowflake-cloud-data-platform - 雪花数据阅读器显示错误的仓库数量
- windows - npm i puppeteer 无法设置 Chromium r756035
- python - 我对 edx CS1301xII 问题 3.2.8 的回答有问题
- javascript - NGRX - 扩展运算符删除属性而不是reducer中的替换
- csv - 如何在 Jmeter 中一次使用 CSV Data Set Config 读取 csv 文件(而不是逐行)
- html - 如何导航到不同页面中的部分