Navigation component + Dagger: не получается получить в SavedStateHandle аргумент, передаваемый в destination Action
Я использую Navigation Component, и при навигации передаю Int-значение, которое в вьюмодели destination-фрагмента вынимаю из savedStateHandle. Все работало ОК, пока проект я использовал Hilt для DI. Но в целях изучения обычного Dagger решил перевести проект на Dagger, и SavedStateHandle перестал работать должным образом (не могу получить из него направленный аргумент - в нем всегда дефолтное значение).
Попробовал из подсказок в интернете сработать с помощью ViewModelAssistedFactory с AbstractSavedStateViewModelFactory, но успехом попытка не увенчалась (тот же behavior).
Подскажите пожалуйста, где может быть проблема?
Вот так я перенаправляюсь в CharacterDetailFragment:
private fun onCharacterClick(character: Character) {
val action = CharactersFragmentDirections.actionCharactersFragmentToCharacterDetailFragment(
character.id
)
findNavController().navigate(action)
}
Это ток как я инициализирую вьюмодель в CharacterDetailFragment:
class CharacterDetailFragment : Fragment(R.layout.fragment_character_detail) {
@Inject
lateinit var assistedFactory: CharacterDetailViewModelAssistedFactory
private val viewModel : CharacterDetailViewModel by viewModels { assistedFactory.create(this) }
override fun onAttach(context: Context) {
super.onAttach(context)
(activity as MainActivity).appComponent.inject(this)
}
Вьюмодель:
class CharacterDetailViewModelFactory @AssistedInject constructor(
private val getCharacterUseCase: GetCharacterUseCase,
@Assisted owner: SavedStateRegistryOwner
) : AbstractSavedStateViewModelFactory(owner, null) {
override fun <T : ViewModel?> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
): T = CharacterDetailViewModel(getCharacterUseCase, handle) as T
}
@AssistedFactory
interface CharacterDetailViewModelAssistedFactory {
fun create(owner: SavedStateRegistryOwner) : CharacterDetailViewModelFactory
}
class CharacterDetailViewModel @Inject constructor(
private val getCharacterUseCase: GetCharacterUseCase,
private val handle: SavedStateHandle
) : ViewModel() {
val charId = handle.get<Int>("charId") ?: 0
private var _character: Character? = null
val character = MutableLiveData<Character>()
init {
handle.get<Int>("charId")?.let {
getCharacter(it)
}
Log.d(TAG, "char id: ${charId}")
}
}
В NavGraph:
<fragment
android:id="@+id/charactersFragment"
android:name="space.rodionov.rickandmorty.presentation.character.characterlist.CharactersFragment"
android:label="Characters"
tools:layout="@layout/fragment_characters">
<action
android:id="@+id/action_charactersFragment_to_characterDetailFragment"
app:destination="@id/characterDetailFragment" />
</fragment>
<fragment
android:id="@+id/characterDetailFragment"
android:name="space.rodionov.rickandmorty.presentation.character.characterdetail.CharacterDetailFragment"
android:label="Character details"
tools:layout="@layout/fragment_character_detail">
<argument
android:name="charId"
app:argType="integer" />
</fragment>
Ответы (1 шт):
Не получаете, потому что не передаёте:
) : AbstractSavedStateViewModelFactory(owner, null) {
вместо null тут должны быть те самые аргументы из фрагмента