簡體   English   中英

如何使用 Hilt 將 safe-args 參數注入視圖模型?

[英]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。

我在這里發現了一個類似的問題。 在寫這個問題的時候,只有這個答案可用,它對我沒有任何幫助,我也相信提出這個問題的人。

我檢查了答案中鏈接的 repo,它通過在 viewmodel 中創建一個 init 方法並在 Activity/Fragment 中調用它來“解決”問題。

由於視圖模型已經被注入,這個解決方案對我來說似乎並不理想,我想知道在使用 hilt 時是否還有其他可用的選項。

對於面臨相同挑戰並使用 Hilt 的任何人,訣竅是在 viewModel 構造函數中初始化 SavedStateHandle,即

保存狀態句柄:保存狀態句柄 = SaveStateHandle()

然后您可以訪問傳遞的參數,例如:val id: String? = savedStateHandle["id"] 或 val id = savedStateHandle.get<String?>("id")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM