================================================================================
在 MVVM 中, ViewModel 的重要职责是解耦 View 与 Model。
-
View 向 ViewModel 发出指令,请求数据
-
View 通过 DataBinding 或 LiveData 等订阅 ViewModel 的数据变化
关于订阅 ViewModel 的时机,大家一般放在 onViewCreated ,这是没有问题的。但是一个常犯的错误是将 ViewModel 中首次的数据加载也放到 onViewCreated 中进行:
//DetailTaskViewModel.kt
class DetailTaskViewModel : ViewModel() {
private val _task = MutableLiveData()
val task: LiveData = _task
fun fetchTaskData(taskId: Int) {
viewModelScope.launch {
_task.value = withContext(Dispatchers.IO){
TaskRepository.getTask(taskId)
}
}
}
}
//DetailTaskFragment.kt
class DetailTaskFragment : Fragment(R.layout.fragment_detailed_task){
private val viewModel : DetailTaskViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//订阅 ViewModel
viewMode.uiState.observe(viewLifecycleOwner) {
//update ui
}
//请求数据
viewModel.fetchTaskData(requireArguments().getInt(TASK_ID))
}
}
如上,如果 ViewModel 在 onViewCreated 中请求数据,当 View 因为横竖屏等原因重建时会再次请求,而我们知道 ViewModel 的生命周期长于 View,数据可以跨越 View 的生命周期存在,所以没有必要随着 View 的重建反复请求。
====================================