我发现了类似的问题here。在写这个问题时只有这个答案,这对我没有任何帮助,我相信对提出问题的人也有帮助。
我检查了答案中链接的存储库,它通过在视图模型中创建 init 方法并在 Activity/Fragment 中调用它来“解决”问题。
由于 viewmodel 已经被注入,这个解决方案对我来说似乎不太理想,我想知道使用 hilt 时是否还有其他选项可用。
根据 this comment 和 AndroidX Hilt 1.0.0-alpha03 的发布,Hilt 支持采用
SavedStateHandle
作为参数(与其他注入参数一起)的 ViewModel。
这个
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.
}
}
Safe Args 与 SavedStateHandle 集成的功能请求已修复,并将成为即将发布的 Navigation 2.4.0-alpha01
版本的一部分。一旦发布,您就可以执行类似
MainFragmentArgs.fromSavedStateHandle(savedStateHandle)
的操作来获得与您当前可以从 ViewModel 中的
Args
获得的相同
by navArgs()
类。
SavedStateHandle
构造函数中初始化
viewModel
,即
savedStateHandle: SavedStateHandle = SavedStateHandle()
然后您可以访问传递的参数,例如:
val id: String? = savedStateHandle["id"]
或
val id = savedStateHandle.get<String?>("id")