переданные из одного фрагмента в другой через navigation safeargs заинжектить во viewModel?
Чтобы было понятно, в чем проблема, опишу, что я сделал:
У меня есть MainFragment и Fragment1. Я хочу передать строку из MainFragment в Fragment1
В navigation.xml у меня такой код:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/navigation"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.example.navigationdemo.ui.fragments.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_mainFragment_to_fragment1"
app:destination="@id/fragment1" />
</fragment>
<fragment
android:id="@+id/fragment1"
android:name="com.example.navigationdemo.ui.fragments.Fragment1"
android:label="fragment_1"
tools:layout="@layout/fragment_1" >
<argument
android:name="myArgument"
app:argType="string"
android:defaultValue="Default value" />
</fragment>
</navigation>
В методе onViewCreated MainFragment:
binding?.goToScreen1?.setOnClickListener {
val action = MainFragmentDirections.actionMainFragmentToFragment3(myArgument = "MyParam")
navController.navigate(action)
}
}
А во фрагменте Fragment1: у меня такой код:
private val args by navArgs<Fragment1Args>()
private val myStringArg = args.myArgument
private val myViewModel by viewModel<MyViewModel> {parametersOf(myStringArg)}
Падает с ошибкой:
IllegalStateException: Fragment Fragment1{5de6d39} (1be22b81-0952-4ba7-b30c-fa3d724cbae5) has null arguments
Проблема ясна: на момент инициализвации viewModel аргументы еще не известны, так как если этот коде закоментить и в методе Fragmen1::onCreate вызвать args.myArgument, то переданное значение из MainFragment мы получим без всяких падений.
Вопрос: как же правильно передавать параметры во viewModel, когда сами параметры мы передаем через через navigation safeargs?
Кейс должен быть довольно частым, но я ничего не нагуглил. Заранее спасибо тебе за ответ, добрый человек) Сорян за такую простыню
Это всё классно, конечно, но такую портянку кода надо в гист или пастбин постить
Ну так инициализируй вью модель после того как аргументы будут известны
Обсуждают сегодня