Android ViewModelProvider.Factory CreationExtras。为什么要用它?

问题描述 投票:0回答:1

我很难理解自定义 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
}
android kotlin mvvm android-jetpack android-viewmodel
1个回答
0
投票

CreationExtras
为您提供了
SavedStateHandle
,它允许在进程死亡时保存和恢复UI状态。

© www.soinside.com 2019 - 2024. All rights reserved.