I'm trying to send three values to my UserViewModel
but even if sending the savedStateHandle
In my Activity
I have
private val viewModel: UserViewModel by viewModels()
Then my UserViewModel
is :
@HiltViewModel
internal class UserViewModel @Inject constructor(
private val myRepo: MyRepo,
private val savedStateHandle: SavedStateHandle,
) : ViewModel() {
But then this savedStateHandle
is empty, what I'm missing?
CodePudding user response:
If you are using MVVM based on the Android Architecture guidelines you can send an event to the viewmodel from your Activity/Fragment once your view is created.
CodePudding user response:
You must add savedStateHandle in AppModule. You want inject savedStateHandle.
CodePudding user response:
I've been using @AssistedInject
to do so as follows :
internal class UserViewModel @AssistedInject constructor(
...
@Assisted val name: String,
) : ViewModel() {
...
}
Then I had to create a 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
}
}
Then in the Activity/Fragment
you have to inject the AssistedFactory
as follows
@Inject internal lateinit var assistedFactory: UserViewModel.UserViewModelAssistedFactory
private val userViewModel: UserViewModel by viewModels {
UserViewModel.Factory(assistedFactory, intent.getStringExtra(USER_NAME_ARG).orEmpty())
}
Doing this it should work, but also your solution should work make sure you are sending the intent args correctly because it says is null looks like what you are passing is not correct, savedInstace.keys()
should return everything you passed from your previous Activity/Fragment
.