我很难理解自定义 ViewModelProvider.Factory 使用 CreationExtras 的必要性。
我知道如果你想在初始化视图模型时使用一些自定义逻辑,你需要定义工厂,但我一直做的是将我的参数直接传递给工厂的构造函数,然后在实例化视图模型时使用它们。 CreationExtras 对象实现什么功能?为什么不直接将参数传递给工厂构造函数?
这是 Google 的使用示例:
class MyViewModel(
private val myRepository: MyRepository,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
// ViewModel logic
// ...
// Define ViewModel factory in a companion object
companion object {
val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(
modelClass: Class<T>,
extras: CreationExtras
): T {
// Get the Application object from extras
val application = checkNotNull(extras[APPLICATION_KEY])
// Create a SavedStateHandle for this ViewModel from extras
val savedStateHandle = extras.createSavedStateHandle()
return MyViewModel(
(application as MyApplication).myRepository,
savedStateHandle
) as T
}
}
}
}
我习惯做的是创建一个实现 ViewModelProvider.Factory 接口的自定义类,并在构造函数中采用这些参数:类似
class MyFactory(val repository: MyRepository){
// use repository when creating instance of VM
}
CreationExtras
为您提供了SavedStateHandle
,它允许在进程死亡时保存和恢复UI状态。