我有一個活動。此活動正在接收一些引數。目前,我可以viewModel使用這些引數通過輔助注入創建一個。
//activity code
private val viewModel: ViewModel by viewModels {
val keyName = intent.extras?.getString(KEY_NAME).orEmpty()
ViewModel.provideFactory(keyName)
}
現在,我有一個navHostFragment導航圖中的所有片段都將使用我之前在活動中創建的視圖模型。但我找不到分享該 viewModel 的方法
我已經知道我們可以用來activityViewModels與活動共享 viewModel
//fragment code
private val sharedViewModel: ViewModel by activityViewModels()
但是我sharedViewModel沒有沒有輔助引數的建構式(并且在運行時失敗)。
目前,我有兩個解決方案
第一個選項:在每個片段中“創建”一個新的 viewModel,并使用 activityViewModels 從活動(或 navArgs)接收引數以共享相同的實體(我不喜歡這種方法,但可以)
private val viewModel: ViewModel by activityViewModels {
val keyName = navArgs.keyName
ViewModel.provideFactory(keyName)
}
第二個選項:從建構式中洗掉輔助引數并在 viewModel 中創建一個方法來設定我需要的資訊:
@HiltViewModel
class ViewModel @Inject constructor(
private val repository,
.....
) : ViewModel() {
fun setKeyName(keyName: String)....
所以,我的問題是......有沒有辦法在活動中創建一個帶有輔助引數的視圖模型,并與片段共享該視圖模型?
uj5u.com熱心網友回復:
使用 hilt 庫現在支持以SavedStateHandle引數和值SavedStateHandle自動傳遞的視圖模型。您所要做的就是通過以下方式接收價值
@HiltViewModel
class ViewModel @Inject constructor(
private val repository, savedStateHandle: SavedStateHandle
) : ViewModel() {
init {
// Use the same argName as in your navigation graph
val name : String = savedStateHandle["keyName"]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411988.html
標籤:
上一篇:行小部件內容未顯示
