android - 如何使用 Hilt 将安全参数参数注入(inject) View 模型?

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

我发现了一个类似的问题 here .在撰写此问题时 there is only this answer avaliable ,这对我没有任何帮助,我也相信提出问题的人。
我检查了答案中链接的 repo,它通过在 viewmodel 中创建一个 init 方法并在 Activity/Fragment 中调用它来“解决”问题。
由于 View 模型已经被注入(inject),这个解决方案对我来说似乎并不理想,我想知道在使用 hilt 时是否还有其他可用的选项。

最佳答案

根据 this comment以及 AndroidX Hilt 1.0.0-alpha03 的发布, Hilt 支持采用 SavedStateHandle 的 ViewModel作为参数(与您的其他注入(inject)参数一起)。
这个SavedStateHandle会自动填充传递给 fragment 的参数(即,您从 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.
    }
}
feature request for Safe Args integration with SavedStateHandlealready fixed并将成为即将推出的导航 2.4.0-alpha01 的一部分发布。一旦发布,您就可以执行 MainFragmentArgs.fromSavedStateHandle(savedStateHandle) 之类的操作。得到相同的Args您目前可以从 by navArgs() 获得的类(class)在您的 ViewModel 中。

关于android - 如何使用 Hilt 将安全参数参数注入(inject) View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67350331/

相关文章:

java - 启动 Activity 会使应用程序崩溃,否则该应用程序是 minimazin

java - LibGDX 如何将游戏放入表格中? *** 固定的 ***

android - Camera2 API 焦点不适用于 Google Pixel

java - Manifest.xml 中的 Kotlin 内部类广播接收器

java - Spring Autowiring 无法看到上下文 bean,除非在基础包上定义了组件扫描

java - 我想要 Spring 注入(inject)的函数需要可变参数。我应该提供一个需要列表的重载吗?

php - 为 Symfony MicroKernel 注册自定义配置命名空间

Java + Android Jetpack + Dagger 2 在 ViewModel 中注入(inject)

android - 结合 android ViewModel 和数据绑定(bind)的最佳实践

android - 与 LiveData 一起使用时返回语句的用途是什么