Search code examples
androidandroid-studiodagger-2dagger

How do add a Repository to the Dagger Room Module?


How do I add a Repository to the Dagger Room Module? My Repository uses application when I try to add this class to a Module I get an error. How do I properly embed this repository in Dagger so that later I can do an injection in my ViewModel class? Why the first two functions are normally implemented in the Room Module and the last one is not. Any help My Repository:

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

Exception:

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
    }

Solution

  • @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
    }