[英]How to use Hilt to inject a safe-args argument into a viewmodel?
我在這里發現了一個類似的問題。 在寫這個問題時,只有這個答案可用,這對我沒有任何幫助,我相信也對提出問題的人有幫助。
我檢查了答案中鏈接的回購協議,它通過在視圖模型中創建一個 init 方法並在 Activity/Fragment 中調用它來“解決”問題。
由於已經注入了 viewmodel,這個解決方案對我來說似乎不太理想,我想知道在使用 hilt 時是否還有其他選項可用。
根據此評論和AndroidX Hilt 1.0.0-alpha03的發布,Hilt 支持將SavedStateHandle
作為參數(與其他注入參數一起)的 ViewModel。
這個SavedStateHandle
會自動填充傳遞給您的片段的 arguments(即,您從requireArguments()
獲得的相同 arguments 和 Safe Args 讀取的相同 arguments)。
因此,在您的 ViewModel 的構造函數中,您可以立即從SavedStateHandle
訪問那些 arguments,而無需手動將 arguments 傳遞給您的 ViewModel。
@HiltViewModel
class MainViewModel @Inject constructor(
val userDataManager: UserDataManager,
savedStateHandle: SavedStateHandle
) : ViewModel() {
init {
// Use the same argName as in your navigation graph
val yourArgument: String = savedStateHandle["argName"]
// Now use that argument to load your data, etc.
}
}
Safe Args 與 SavedStateHandle 集成的功能請求已經修復,並將成為即將發布的 Navigation 2.4.0-alpha01
版本的一部分。 一旦發布,您就可以執行MainFragmentArgs.fromSavedStateHandle(savedStateHandle)
之類的操作來獲取與您當前可以通過 ViewModel 中by navArgs()
獲取的相同的Args
class。
對於面臨相同挑戰並使用 Hilt 的任何人,訣竅是在 viewModel 構造函數中初始化 SavedStateHandle,即
保存狀態句柄:保存狀態句柄 = SaveStateHandle()
然后您可以訪問傳遞的參數,例如:val id: String? = savedStateHandle["id"] 或 val id = savedStateHandle.get<String?>("id")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.