如何使用 Hilt 将 safe-args 参数注入视图模型?

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

我发现了类似的问题here。在写这个问题时只有这个答案,这对我没有任何帮助,我相信对提出问题的人也有帮助。

我检查了答案中链接的存储库,它通过在视图模型中创建 init 方法并在 Activity/Fragment 中调用它来“解决”问题。

由于 viewmodel 已经被注入,这个解决方案对我来说似乎不太理想,我想知道使用 hilt 时是否还有其他选项可用。

android dependency-injection android-viewmodel android-jetpack-navigation dagger-hilt
2个回答
64
投票

根据 this commentAndroidX Hilt 1.0.0-alpha03 的发布,Hilt 支持采用

SavedStateHandle
作为参数(与其他注入参数一起)的 ViewModel。

这个

SavedStateHandle
会自动填充传递给片段的参数,无需您执行任何操作(即,您从
requireArguments()
获得的相同参数以及由 Safe Args 读取的相同参数)。

因此,在 ViewModel 的构造函数中,您可以立即从

SavedStateHandle
访问这些参数,而无需手动将参数传递给 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 中的 
Args
 获得的相同 
by navArgs()
 类。


0
投票
对于任何面临同样挑战并使用 Hilt 的人来说,诀窍是在

SavedStateHandle

 构造函数中初始化 
viewModel
,即 

savedStateHandle: SavedStateHandle = SavedStateHandle()
然后您可以访问传递的参数,例如:

val id: String? = savedStateHandle["id"]

val id = savedStateHandle.get<String?>("id")
    
© www.soinside.com 2019 - 2024. All rights reserved.