java.lang.RuntimeException: невозможно создать экземпляр класса MovieViewModel, а хранилище не инициализировано - PullRequest
0 голосов
/ 01 марта 2019

Когда я внедряю viewModel и репозиторий, это дает мне эту ошибку, но я думаю, что все сделал правильно.

Ошибка журнала

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.apps.abousalem.movies/com.apps.abousalem.movies.ui.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property repository has not been initialized
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2457)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2519)
    at android.app.ActivityThread.access$1200(ActivityThread.java:165)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5669)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
 Caused by: kotlin.UninitializedPropertyAccessException: lateinit property repository has not been initialized
    at com.apps.abousalem.movies.ui.base.BaseViewModel.getRepository(BaseViewModel.kt:11)
    at com.apps.abousalem.movies.ui.MoviesViewModel.<init>(MoviesViewModel.kt:13)
    at java.lang.reflect.Constructor.newInstance(Native Method)
    at java.lang.Class.newInstance(Class.java:1606)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:196)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:255)
    at androidx.lifecycle.ViewModelProvider$FactoryWrapper.create(ViewModelProvider.java:268)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:179)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:147)
    at com.apps.abousalem.movies.di.module.ActivityModule.provideMoviesViewModel(ActivityModule.kt:35)
    at com.apps.abousalem.movies.di.module.ActivityModule_ProvideMoviesViewModelFactory.proxyProvideMoviesViewModel(ActivityModule_ProvideMoviesViewModelFactory.java:27)
    at com.apps.abousalem.movies.di.module.ActivityModule_ProvideMoviesViewModelFactory.get(ActivityModule_ProvideMoviesViewModelFactory.java:18)
    at com.apps.abousalem.movies.di.module.ActivityModule_ProvideMoviesViewModelFactory.get(ActivityModule_ProvideMoviesViewModelFactory.java:8)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at com.apps.abousalem.movies.di.component.DaggerMoviesActivityComponent.injectMainActivity(DaggerMoviesActivityComponent.java:55)
    at com.apps.abousalem.movies.di.component.DaggerMoviesActivityComponent.inject(DaggerMoviesActivityComponent.java:45)
    at com.apps.abousalem.movies.ui.MainActivity.onCreate(MainActivity.kt:28)
    at android.app.Activity.performCreate(Activity.java:6102)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2410)

здесь ActivityModule где я предоставляю ViewModel ActivityModule

@Module
class ActivityModule(private val activity: AppCompatActivity){
@ActivityScope
@ActivityContext
@Provides
fun provideContext():Context{
    return activity
}
@ActivityScope
@ActivityContext
@Provides
fun provideActivity():AppCompatActivity{
    return activity
}
@ActivityScope
@Provides
fun provideMoviesViewModel(): MoviesViewModel {
    return ViewModelProviders.of(activity).get(MoviesViewModel::class.java)
}
@ActivityScope
@Provides
fun provideBaseViewModel(): BaseViewModel {
    return ViewModelProviders.of(activity).get(BaseViewModel::class.java)
}
}

и здесь, где я предоставляю Repository класс

Прикладной модуль

@Module
class ApplicationModule(var application: Application){

@ApplicationScope
@ApplicationContext
@Provides
fun provideContext(): Context {
    return application
}

@ApplicationScope
@ApplicationContext
@Provides
fun provideApplication(): Application {
    return application
}

@ApplicationScope
@Provides
fun getMovieDatabase(@ApplicationContext context: Application): MovieDatabase {
    return MovieDatabase.getInstance(context)
}

@ApplicationScope
@Provides
fun getSharedPreference(@ApplicationContext context: Context): SharedPreferences {
    return context.getSharedPreferences(MOVIES_PREFERENCE, Context.MODE_PRIVATE)
}

@ApplicationContext
@ApplicationScope
@Provides
fun getRepository(moviesApi: MoviesApi, movieDatabase: MovieDatabase, sharedPreferences: SharedPreferences): MoviesRepository {
    return MoviesRepository(moviesApi, movieDatabase, sharedPreferences)
}

}

и здесь, где я его внедряю.

BaseViewModel

open class BaseViewModel: ViewModel(){
@Inject
lateinit var repository: MoviesRepository
}

Я не могу понять, почему этослучилось почему не могу инициализировать repository и viewmodel

1 Ответ

0 голосов
/ 01 марта 2019

Вы аннотировали ваш repository: MoviesRepository для инъекции при инъекции, но вы, кажется, никогда не внедряете объект viewmodel (ViewModelProviders только обеспечивает и не делает инъекцию).

Вы можете сделать это инъекционным, добавив fun inject(viewModel: MyFinalViewModel) в свой класс компонента кинжала, и внедрить его, вызывая component.inject(viewModel).
Если вы не хотите внедрять модели представления (кажется немного явным), попробуйте передатьзависимости в их конструкторах.

...