Home > Mobile >  Send intent arguments from bundle to ViewModel using Hilt
Send intent arguments from bundle to ViewModel using Hilt

Time:12-08

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.

  • Related