ViewModelProvider
是 Android Jetpack 中的一個類,用于管理和提供 ViewModel
實例。當設備的配置發生變化(例如屏幕方向、語言或資源變化)時,使用 ViewModelProvider
可以確保您的應用正確地處理這些變化。
以下是處理配置變化時使用 ViewModelProvider
的步驟:
Activity
或 Fragment
中,首先獲取一個 ViewModelProvider
實例:val viewModelProvider = ViewModelProvider(this)
viewModelProvider.get()
方法獲取您需要的 ViewModel
實例。這將返回一個已創建的 ViewModel
(如果已經存在)或創建一個新的 ViewModel
(如果不存在):val myViewModel = viewModelProvider.get(MyViewModel::class.java)
ViewModel
數據,您需要確保 ViewModel
類繼承自 AndroidViewModel
。AndroidViewModel
是 ViewModel
的子類,它接收一個 Application
實例作為參數,并在其構造函數中調用 super(application)
。這使得 AndroidViewModel
能夠訪問應用程序的生命周期,從而在配置變化時保持數據:import androidx.lifecycle.AndroidViewModel
class MyViewModel(application: Application) : AndroidViewModel(application) {
// ...
}
Activity
或 Fragment
的生命周期方法中(例如 onSaveInstanceState()
和 onCreate()
),使用 ViewModelProvider
獲取或重新創建 ViewModel
實例。這將確保在配置變化時始終使用最新的 ViewModel
實例:override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val viewModelProvider = ViewModelProvider(this)
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
outState.putParcelable("my_view_model", myViewModel)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState != null) {
val viewModelProvider = ViewModelProvider(this)
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
// 使用已保存的 ViewModel 實例
} else {
val viewModelProvider = ViewModelProvider(this)
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
// 創建新的 ViewModel 實例
}
}
通過遵循這些步驟,您可以確保在設備配置發生變化時,使用 ViewModelProvider
管理的 ViewModel
能夠正確地保持和處理數據。