0

I'm using Hilt as Dependency Injection to inject Room, ViewModel, Repositories, and other components but I'm getting the following exception while injecting Database module.

Exception

Caused by: java.lang.RuntimeException: cannot find implementation for 
com.qst.qstmoviesapp.db.MovieDatabase. MovieDatabase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:100)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1486)
at com.qst.qstmoviesapp.di.DatabaseModule.provideDatabase(DatabaseModule.kt:28)
atcom.qst.qstmoviesapp.di.DatabaseModule_ProvideDatabaseFactory.provideDatabase(DatabaseModule_ProvideDatabaseFactory.java:37)
at com.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(DaggerMovieApp_HiltComponents_SingletonC.java:656)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)                                                                                                     at
com.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl.movieDao(DaggerMovieApp_HiltComponents_SingletonC.java:610)
atcom.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl.access$1700(DaggerMovieApp_HiltComponents_SingletonC.java:594)
at com.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(DaggerMovieApp_HiltComponents_SingletonC.java:653)                                                                                                        at
dagger.internal.DoubleCheck.get(DoubleCheck.java:47)                                                                                                        atcom.qst.qstmoviesapp.DaggerMovieApp_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerMovieApp_HiltComponents_SingletonC.java:518)                                                                                                     at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$1.create(HiltViewModelFactory.java:104)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:89)
at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:116)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
at com.qst.qstmoviesapp.ui.MovieFragment.getMovieViewModel(MovieFragment.kt:30)

ViewModel.kt

@HiltViewModel
class MovieViewModel @Inject constructor(
    private val movieRepository: MovieRepository
): ViewModel(){
    val movies = movieRepository.movies
}

Repository

@Singleton
class MovieRepository @Inject constructor(movieDao: MovieDao) {
    val movies: LiveData<List<Movie>> = movieDao.getMovies()
}

Database Module

@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
    @Provides
    fun provideMovieDao(movieDatabase: MovieDatabase) = movieDatabase.movieDao()

    @Singleton
    @Provides
    fun provideDatabase(@ApplicationContext context: Context): MovieDatabase {
        return Room.databaseBuilder(
            context,
            MovieDatabase::class.java,
            "qst_movies.db")
            .build()
    }
}

Movie DAO

@Dao
interface MovieDao {
    @Query("SELECT * FROM movies")
    fun getMovies(): LiveData<List<Movie>>
}

Movie Database

@Database(entities = arrayOf(Movie::class), version = 1, exportSchema = false)
abstract class MovieDatabase: RoomDatabase(){
    abstract fun movieDao(): MovieDao
}

Fragment

@AndroidEntryPoint
class MovieFragment : Fragment() {

    private var _binding: FragmentMovieBinding? = null
    private val binding get() = _binding!!

    @Inject lateinit var movieAdapter: MoviesAdapter

    val movieViewModel: MovieViewModel by viewModels()
}

dependencies from app/build.gradle

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.5.0'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation "androidx.fragment:fragment-ktx:1.5.2"
    implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
    implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
    implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

    implementation("com.google.dagger:hilt-android:2.44")
    kapt("com.google.dagger:hilt-android-compiler:2.44")

    testImplementation 'junit:junit:4.13.2'

    androidTestImplementation 'androidx.test.ext:junit:1.1.4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'

    implementation 'com.github.bumptech.glide:glide:4.14.2'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2'

    implementation "androidx.recyclerview:recyclerview:1.2.0-alpha06"

    implementation platform('com.google.firebase:firebase-bom:31.1.1')
    implementation 'com.google.firebase:firebase-firestore-ktx'

    implementation("androidx.room:room-runtime:2.4.3")
    annotationProcessor("androidx.room:room-compiler:2.4.3")
}

Can someone please point out what might be missing? Thanks!

Mustansar Saeed
  • 2,730
  • 2
  • 22
  • 46

0 Answers0