如何向Dagger Room模块添加存储库?

问题描述 投票:0回答:1

我如何向Dagger Room模块添加存储库?当我尝试将此类添加到模块时,我的存储库使用了应用程序,但出现错误。我如何正确地将此存储库嵌入Dagger中,以便以后可以在ViewModel类中进行注入?为什么前两个功能通常在房间模块中实现而后一个功能却没有。任何帮助我的资料库:

   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)

AppComponent:

@Singleton
@Component(modules = [ContextModule::class, NetworkModule::class, RoomModule::class])
interface ApplicationComponent {

    fun inject(activity: ContactListActivity)
    fun inject(activity: AddContactActivity)
    fun inject(app: Application)
}

ViewNodel:

class ContactsViewModel @Inject constructor(private val contactRepository: ContactRepository) : ViewModel() {

    fun getAllContacts(): MutableLiveData<ArrayList<Contact>>{
        val contacts = contactRepository.getAllContact()
        return contacts
    }
android android-studio dagger-2 dagger
1个回答
0
投票
@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
}
© www.soinside.com 2019 - 2024. All rights reserved.