Самый простой способ - использовать функцию расширения KTX activityViewModels<VM : ViewModel>
см. здесь .
Из do c:
Возвращает свойство делегировать доступ к ViewModel родительского действия ...
Он извлечет экземпляр ViewModel
, предоставленный ViewModelProviders
действия, к которому прикреплены фрагменты. Таким образом, любое изменение экземпляра модели представления будет отражено на всех фрагментах.
Вот простой пример:
class MVModel: ViewModel() {
var count = MutableLiveData(0)
fun increment() {
count.value = count.value!!.plus(1)
}
}
class MFragment: Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentMBinding.inflate(inflater, container, false)
val viewModel by activityViewModels<MVModel>()
binding.lifecycleOwner = this // <-- this enables MutableLiveData update the UI
binding.vm = viewModel
return binding.root
}
}