Самая чистая реализация должна использовать Kotlin для своих расширенных функций. Вы можете создать этот kotlin код в отдельном Kclass или оставить этот ответ для будущих пользователей, которые хотят знать, как это сделать в Kotlin. По сути, мы инициализируем ViewModel с помощью lazy следующим образом:
Убедитесь, что у вас есть эта зависимость:
implementation "androidx.fragment:fragment-ktx:1.2.0"
Создайте эту вспомогательную функцию, которая обращается к внутреннему методу фрагмента-ktx, который позволяет вам создать экземпляр ViewModel от lazy:
@MainThread
inline fun <reified VM : ViewModel> Fragment.fragmentViewModel() =
createViewModelLazy(
VM::class,
{ this.viewModelStore },
{ ViewModelFactory(Database.getDatabase(requireContext().applicationContext)) }
)
Теперь создайте ViewModelFactory, используя этот официальный java пример:
https://github.com/android/architecture-components-samples/blob/master/BasicRxJavaSample/app/src/main/java/com/example/android/observability/ui/ViewModelFactory.java
Или, вот вариант Kotlin:
class ViewModelFactory(private val database: Database?) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
requireNotNull(database) { "Database must not be null" }
return when {
modelClass.isAssignableFrom(ItemSetupFragmentModel::class.java) -> {
ItemSetupFragmentModel() as T
}
else -> {
throw IllegalArgumentException("Unknown ViewModel class")
}
}
}
}
А теперь go внутри вашего фрагмента и просто инициализируйте вашу ViewModel следующим образом
class ItemSetupFragment : Fragment() {
private val model by viewModel<ItemSetupFragmentModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.getKids().observe(this, users -> {
// update UI
});
}
}
Надеюсь, это поможет!