我发现了一个类似的问题here.在写这个问题there is only this answer avaliable的时候,它对我没有提供任何帮助,我相信也对问这个问题的人有帮助。
我检查了答案中链接的repo,它通过在视图模型中创建一个init方法并在Activity/Fragment中调用它来“解决”问题。
由于视图模型已经被注入,这个解决方案对我来说似乎并不理想,我想知道在使用刀柄时是否有其他可用的选项。
我发现了一个类似的问题here.在写这个问题there is only this answer avaliable的时候,它对我没有提供任何帮助,我相信也对问这个问题的人有帮助。
我检查了答案中链接的repo,它通过在视图模型中创建一个init方法并在Activity/Fragment中调用它来“解决”问题。
由于视图模型已经被注入,这个解决方案对我来说似乎并不理想,我想知道在使用刀柄时是否有其他可用的选项。
2条答案
按热度按时间gev0vcfq1#
根据这条评论和AndroidX Hilt 1.0.0-alpha 03的发布,Hilt已经支持将
SavedStateHandle
作为参数的ViewModel(就在其他注入参数旁边)。这个
SavedStateHandle
会自动填充传递给片段的参数(即,从requireArguments()
中获得的参数和安全参数读取的参数),而无需您执行任何操作。因此,在ViewModel的构造函数中,您可以立即从
SavedStateHandle
访问这些参数,而不必手动将参数传递给ViewModel。feature request for Safe Args integration with SavedStateHandle是already fixed,它将是即将发布的Navigation
2.4.0-alpha01
的一部分。一旦发布了2.4.0-alpha01
,你就可以做类似MainFragmentArgs.fromSavedStateHandle(savedStateHandle)
的事情来获得Args
类,你现在可以在ViewModel中从by navArgs()
获得Args
类。oxf4rvwz2#
对于任何面临相同挑战并使用Hilt的人来说,诀窍是在viewModel构造函数中初始化SavedStateHandle,即
保存状态句柄:保存状态句柄=保存状态句柄()
然后,您可以访问传递的参数,如下所示:瓦尔是,则返回一个值。如果是,则返回值。