я могу отправить обнуляемый тип данных в качестве аргумента, используя safeargs? если нет, что мне делать? - PullRequest
0 голосов
/ 23 марта 2020

говорят, что у меня есть 2 фрагмента. Логин и Дом. Я задаю Фрагмент Home как глобальный пункт назначения с аргументами userData

enter image description here

, если пользователь еще не вошел в систему, он будет начинаться с фрагмента входа , после входа в систему и получения userData с сервера, он перейдет в Home и передаст userData, используя этот код

 val home = AuthenticationFragmentDirections.actionGlobalHomeFragment(userData)
 Navigation.findNavController(view).navigate(home, navOptions)

, но проблема заключается в том, что пользователь уже входит в систему и открывает приложение. в этой ситуации они непосредственно откроют фрагмент дома. и мое приложение cra sh с ошибкой

java .lang.IllegalArgumentException: обязательный аргумент "userData" отсутствует и не имеет android: defaultValue

поэтому я предполагаю, что могу установить обнуляемый тип данных в таких аргументах, как User?, поэтому фрагмент Home не нуждается в userData, если он не получен из Login

после чтения из здесь , я установил аргумент как этот для достижения User?

<argument
    android:name="userData"
    android:defaultValue="@null"
    app:argType="User"
    app:nullable="true" />

, но проблема в том, что у меня слишком много аргументов, когда я помещаю пользовательские данные для отправки домой из фрагмента входа в систему

Я использую это в Gradle

implementation "androidx.navigation:navigation-fragment-ktx:2.3.0-alpha04"
    implementation "androidx.navigation:navigation-ui-ktx:2.3.0-alpha04"

1 Ответ

4 голосов
/ 23 марта 2020

При использовании apply plugin: "androidx.navigation.safeargs" в метод actionGlobalHomeFragment() передаются только обязательные аргументы - аргументы со значениями по умолчанию (т. Е. Те, которые не требуются) передаются сгенерированными методами set:

val home = AuthenticationFragmentDirections.actionGlobalHomeFragment()
    .setUserData(userData)
Navigation.findNavController(view).navigate(home, navOptions)

Если вы переключитесь на генерацию Kotlin кода Safe Args, применив apply plugin: "androidx.navigation.safeargs.kotlin" (обратите внимание на .kotlin), тогда в коде используются Kotlin аргументы по умолчанию (т. Е. С userData: UserData = null в объявлении метода) ), который делает , позволяет вам использовать синтаксис, который вы первоначально пытались:

val home = AuthenticationFragmentDirections.actionGlobalHomeFragment(userData)
Navigation.findNavController(view).navigate(home, navOptions)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...