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



我在这里发现了一个类似的问题。在写这个问题的时候,只有这个答案,它对我没有任何帮助,我相信对提问者也没有帮助。

我检查了答案中链接的回购;解决";通过在视图模型中创建一个init方法并在Activity/Fragment中调用它来解决问题。

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

根据此评论和AndroidX Hilt 1.0.0-alpha03的发布,Hilt支持将SavedStateHandle作为参数的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.
}
}

安全Args与SavedStateHandle集成的功能请求已经修复,并将成为即将发布的Navigation2.4.0-alpha01的一部分。一旦发布,您就可以执行类似MainFragmentArgs.fromSavedStateHandle(savedStateHandle)的操作,以获得与您当前能够在ViewModel中从by navArgs()获得的Args类相同的类。

对于任何面临相同挑战并使用Hilt的人,诀窍是初始化viewModel构造函数中的SavedStateHandle,即

savedStateHandle:savedStateHandle=SaveStateHandle((

然后,您可以访问传递的参数,如:val id:String?=savedStateHandle["id"]或val id=savedStateHandle.get<字符串>("id"(

最新更新