// 注入数据参数
fun provideUserViewModelFactory(): MyViewModelFactory {
val repository = UserRepository.getInstance()
return MyViewModelFactory(repository)
}
}
// ViewModel 工厂类
class MyViewModelFactory(
private val userRepository: UserRepository,
) : ViewModelProvider.Factory {
@Suppress(“UNCHECKED_CAST”)
override fun create(modelClass: Class): T {
return MyViewModel(userRepository) as T
}
}
// ViewModel
class MyViewModel(private val userRepository: UserRepository ):ViewModel() {
private var userInfo: MutableLiveData? = null
fun getUserInfo(): LiveData? {
if (userInfo == null) {
userInfo = MutableLiveData()
loadUserInfo()
}
return userInfo
}
private fun loadUserInfo() {
this.userInfo = userRepository.getUserInfo()
}
}
// User 仓库
class UserRepository {
fun getUserInfo():MutableLiveData{
val user = MutableLiveData()
user.value = User(“张三”,“18”)
return user
}
companion object {
// For Singleton instantiation
@Volatile
private var instance: UserRepository? = null
fun getInstance() =
instance ?: synchronized(this) {
instance ?: UserRepository().also { instance = it }
}
}
}
// User 实体
data class User(val name:String,val age:String)
以上示例实现了数据和 UI 分离,并且ViewModel
中没有持有View
接下来我们带着开头的几个问题,深入源码看看它是如何实现的。
[](()(1) 生命周期比组件的长如何实现