如何使用 Hilt 将安全参数注入视图模型?

yll*_*lxh 4 android dependency-injection android-viewmodel android-jetpack-navigation dagger-hilt

在这里找到了一个类似的问题。在撰写此问题时,只有此答案可用,这对我没有任何帮助,我相信对提出问题的人也没有任何帮助。

我检查了答案中链接的 repo,它通过在 viewmodel 中创建一个 init 方法并在 Activity/Fragment 中调用它来“解决”问题。

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

ian*_*ake 16

根据此评论AndroidX Hilt 1.0.0-alpha03 的发布,Hilt 支持将 aSavedStateHandle作为参数的ViewModels (与您的其他注入参数一起)。

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

与SavedStateHandle安全参数数量集成功能要求已经固定,将成为即将到来的导航部分2.4.0-alpha01释放。一旦发布,您就可以执行一些操作,例如MainFragmentArgs.fromSavedStateHandle(savedStateHandle)获取Args当前可以从by navArgs()ViewModel 中获取的相同类。

  • 您应该接手编写 Android 开发人员文档!这应该在文档中提到过!谢谢!:) (2认同)
  • 我尝试了这个,但保存的状态句柄是空的,那里没有参数 (2认同)
  • @GuruKarthiR - [`hiltViewModel()`方法](https://developer.android.com/jetpack/compose/libraries#hilt-navigation)已经支持`SavedStateHandle`。 (2认同)