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.