使用Hilt从bundle发送intent参数到ViewModel



我试图发送三个值到我的UserViewModel,但即使发送savedStateHandle

在我的Activity中我有

private val viewModel: UserViewModel by viewModels()

则我的UserViewModel为:

@HiltViewModel
internal class UserViewModel @Inject constructor(
private val myRepo: MyRepo,
private val savedStateHandle: SavedStateHandle,
) : ViewModel() {

但是这个savedStateHandle是空的,我错过了什么?

我一直在使用@AssistedInject这样做:

internal class UserViewModel @AssistedInject constructor(
...
@Assisted val name: String,
) : ViewModel() {
...
}
然后我必须创建一个Factory
@AssistedFactory
interface UserViewModelAssistedFactory {
fun create(name: String): UserViewModel
}
class Factory(
private val assistedFactory: UserViewModelAssistedFactory,
private val name: String, <-- value you want to pass
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return assistedFactory.create(name) as T
}
}

然后在Activity/Fragment中,您必须按如下方式注入AssistedFactory

@Inject internal lateinit var assistedFactory: UserViewModel.UserViewModelAssistedFactory
private val userViewModel: UserViewModel by viewModels {
UserViewModel.Factory(assistedFactory, intent.getStringExtra(USER_NAME_ARG).orEmpty())
}

这样做它应该工作,但你的解决方案也应该工作,确保你发送的意图参数正确,因为它说的是null看起来像你传递的是不正确的,savedInstace.keys()应该返回你从以前的Activity/Fragment传递的一切。

如果你使用基于Android架构指南的MVVM,你可以从你的Activity/Fragment发送一个事件到视图模型,一旦你的视图被创建。

你必须在AppModule中添加savedStateHandle。你想注入savedStateHandle

最新更新