简体   繁体   中英

Cannot inject interface in kotlin dagger2 mvvm

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.FragmentBuildersM odule_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

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

}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM