【问题标题】:How to use Hilt to inject a safe-args argument into a viewmodel?如何使用 Hilt 将安全参数参数注入视图模型?
【发布时间】:2021-05-01 19:54:01
【问题描述】:

我发现了一个类似的问题here。在写这个问题的时候there is only this answer avaliable,这对我没有任何帮助,我也相信提出这个问题的人。

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

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

【问题讨论】:

标签: android dependency-injection android-viewmodel android-jetpack-navigation dagger-hilt


【解决方案1】:

根据this commentAndroidX Hilt 1.0.0-alpha03 的发布,Hilt 支持将SavedStateHandle 作为参数的视图模型(与其他注入参数一起)。

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

因此,在 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.
    }
}

feature request for Safe Args integration with SavedStateHandlealready fixed,将成为即将发布的 Navigation 2.4.0-alpha01 的一部分。一旦发布,您就可以执行 MainFragmentArgs.fromSavedStateHandle(savedStateHandle) 之类的操作来获得与您当前可以在 ViewModel 中从 by navArgs() 获得的相同的 Args 类。

【讨论】:

  • 不应该“yourArgument”可以为空吗?还是我们应该只使用 "savedStateHandle["argName"]!!"
  • 你应该负责编写 Android 开发者文档!这应该在文档中提到!谢谢! :)
  • 我试过了,但是 savedStateHandle 是空的,那里没有参数
  • 在知道如何使用它之前必须阅读更多帖子 - 使用上面的代码,从片段中 ViewModel 使用val viewModel: MainViewModel by viewModels() 设置
  • @GuruKarthiR - hiltViewModel() method 已经支持 SavedStateHandle
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多