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

aurhwmvo  于 2022-11-27  发布在  Android
关注(0)|答案(2)|浏览(261)

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

gev0vcfq

gev0vcfq1#

根据这条评论和AndroidX Hilt 1.0.0-alpha 03的发布,Hilt已经支持将SavedStateHandle作为参数的ViewModel(就在其他注入参数旁边)。
这个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的一部分。一旦发布了2.4.0-alpha01,你就可以做类似MainFragmentArgs.fromSavedStateHandle(savedStateHandle)的事情来获得Args类,你现在可以在ViewModel中从by navArgs()获得Args类。

oxf4rvwz

oxf4rvwz2#

对于任何面临相同挑战并使用Hilt的人来说,诀窍是在viewModel构造函数中初始化SavedStateHandle,即
保存状态句柄:保存状态句柄=保存状态句柄()
然后,您可以访问传递的参数,如下所示:瓦尔是,则返回一个值。如果是,则返回值。

相关问题