1

hi i am using mvvm and dagger2 when i try to inject my Doa interface in the following class

@Singleton
class PodCastRepository @Inject constructor(private val dao: PodCastDao) {
}

my interface class

interface PodCastDao {

    fun getLegoThemes(): LiveData<PodCast>

}

i am getting the following error

error: [Dagger/MissingBinding] in..myapplication.podcast.data.PodCastDao cannot be provided without an @Provides-annotated method. public abstract interface AppComponent { ^ in..myapplication.podcast.data.PodCastDao is injected at in..myapplication.podcast.data.PodCastRepository(dao) in..myapplication.podcast.data.PodCastRepository is injected at in..myapplication.podcast.PodCastViewModel(repository) in..myapplication.podcast.PodCastViewModel is injected at in..myapplication.di.ViewModelModule.bindThemeViewModel(viewModel) java.util.Map,javax.inject.Provider> is injected at in..myapplication.di.ViewModelFactory(creators) in..myapplication.di.ViewModelFactory is injected at in..myapplication.di.ViewModelModule.bindViewModelFactory(factory) androidx.lifecycle.ViewModelProvider.Factory is injected at in..myapplication.podcast.PodcastFragment.viewModelFactory in..myapplication.podcast.PodcastFragment is injected at dagger.android.AndroidInjector.inject(T) [in..myapplication.di.AppComponent → in..myapplication.di.MainActivityModule_ContributeMainActivity.MainActivitySubcomponent → in..myapplication.di.FragmentBuildersModule_ContributeThemeFragment.PodcastFragmentSubcomponent]

Please help me to fix this issue i am new to dagger also i am using kotlin with mvvm

  • Need to provide a database first. then return dao in your provided method for dao. – Azay Gupta Nov 28 '19 at 13:45
  • First of all dagger cannot provide interface. Since instance of Interface will not be created and you have to provide the implementation, let dagger know how to create the instance or just create the instance by yourself. – Mohammed Rampurawala Dec 12 '19 at 06:36

2 Answers2

1

Need to provide a database first. then return dao in your provided method for dao

for example:

package com.test.demo.db

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.test.demo.model.entity.Movie
import com.test.demo.model.entity.Article
import com.test.demo.util.StringListConverter

@Database(entities = [Article::class,Movie::class],
    version = 3, exportSchema = false)

@TypeConverters(value = [StringListConverter::class/*, (IntegerListConverter::class),
    (KeywordListConverter::class), (VideoListConverter::class), (ReviewListConverter::class)*/])
abstract class AppDatabase : RoomDatabase() {
    abstract fun movieDao(): MovieDao
    abstract fun peopleDao(): ArticleDao
}



package com.test.demo.di

import android.app.Application
import androidx.annotation.NonNull
import androidx.room.Room
import com.test.demo.db.AppDatabase
import com.test.demo.db.MovieDao
import com.test.demo.db.ArticleDao
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module
class PersistenceModule {

  @Provides
  @Singleton
  fun provideDatabase(@NonNull application: Application): AppDatabase {
    return Room
      .databaseBuilder(application, AppDatabase::class.java, "Demo1.db")
      .allowMainThreadQueries()
      .build()
  }

  @Provides
  @Singleton
  fun provideMovieDao(@NonNull database: AppDatabase): MovieDao {
    return database.movieDao()
  }


  @Provides
  @Singleton
  fun providePeopleDao(@NonNull database: AppDatabase): ArticleDao {
    return database.peopleDao()
  }

}
Azay Gupta
  • 281
  • 2
  • 16
0

Dagger can't just create some instance of an interface. That's what the error is saying. You need to tell Dagger what to provide when PodCastDao is needed to be injected.

So you need to create a module if you already don't have it. Then you need to write a code in there to tell Dagger what to inject to PodCastDao:

@Module
class DaoModule {

    // This will tell Dagger how to construct PodCastDao when it's injected somewhere.
    // Could be annotated with @Singleton
    @Provides
    fun providePodCastDao(): PodCastDao {
        return PodCastDaoImpl() // Create implementation for the interface
    }

    // Other Providers for XyzDaos ...

}

And you need to add this module to your AppComponent:

@Singleton // Or not, depends what you want
@Component(modules = { DaoModule.class /*, other modules*/ })
interface AppComponent { }
vilpe89
  • 4,656
  • 1
  • 29
  • 36