169 похожих чатов

Доброе утро, изучаю сейчас navigation и возник вопрос: как данные,

переданные из одного фрагмента в другой через 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?
Кейс должен быть довольно частым, но я ничего не нагуглил. Заранее спасибо тебе за ответ, добрый человек) Сорян за такую простыню

2 ответов

14 просмотров

Это всё классно, конечно, но такую портянку кода надо в гист или пастбин постить

Ну так инициализируй вью модель после того как аргументы будут известны

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта