Jetpack MVVM七宗罪 之三 :在 onViewCreated 中请求数据,这套Github上40K+star面试笔记

本文讨论了在MVVM架构中,如何避免在onViewCreated中过度请求ViewModel数据导致的问题,提倡在ViewModel的init块中加载初始数据,并介绍了LiveDataKTXBuilder和使用SavedStateHandle传递参数的方法,以实现更高效的视图与模型解耦。
摘要由CSDN通过智能技术生成

================================================================================

在 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 的重建反复请求。

正确的加载时机

====================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值