Свойство lateinit viewModelFactory не было инициализировано во фрагменте - PullRequest
0 голосов
/ 02 мая 2018

Я использую кинжал 2 (версия 2.15) для внедрения зависимостей в моем проекте Android. Все работает отлично, кроме внедрения viewModelFactory. Я не могу вставить его в свой фрагмент.

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

private val mainViewModel: StationsViewModel by lazy {
    ViewModelProviders.of(this, viewModelFactory)
            .get(StationsViewModel::class.java)
}

Я получаю следующую ошибку:

lateinit property viewModelFactory has not been initialized

У меня есть ViewModelModule:

@Module

абстрактный класс ViewModelModule {

@Binds
@IntoMap
@ViewModelKey(MainViewModel::class)
internal abstract fun bindsMainViewModel(mainViewModel: MainViewModel): ViewModel

 @Binds
    abstract fun bindViewModelFactory(factory: MyViewModelFactory): ViewModelProvider.Factory
}

ViewModelKey

    @MustBeDocumented
@Target(
        AnnotationTarget.FUNCTION,
        AnnotationTarget.PROPERTY_GETTER,
        AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

и ViewModelFactory

    @Singleton
class MyViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }

    }
}

хотя я не совсем понимаю, что они делают.

1 Ответ

0 голосов
/ 10 июня 2019

Можете ли вы попробовать инициировать в onViewCreated ()?

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    mainViewModel = ViewModelProviders.of(this, viewModelFactory)
        .get(StationsViewModel::class.java)
    // binding.viewmodel = viewModel
}

Все должно быть в порядке.

...