Компонент архитектуры навигации — DestinationFragmentArgs не создается

У меня есть это в приложении Gradle:

apply plugin: 'androidx.navigation.safeargs'

implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0'

и это в проекте gradle:

classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0'

навигационный график:

<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_graph"
    app:startDestination = "@id/loginPhoneNumberFragment">

    <fragment
        android:id = "@+id/loginPhoneNumberFragment"
        android:name = "...fragments.LoginPhoneNumberFragment"
        android:label = "@string/login_activity_title"
        tools:layout = "@layout/fragment_login_phone_number">
        <action
            android:id = "@+id/action_loginPhoneNumberFragment_to_loginCodeFragment"
            app:destination = "@id/loginCodeFragment">
            <argument
                android:name = "prefix"
                app:argType = "string" />
            <argument
                android:name = "phone_number"
                app:argType = "string" />
        </action>
    </fragment>

    <fragment
        android:id = "@+id/loginCodeFragment"
        android:name = "...LoginCodeFragment"
        android:label = "@string/login_activity_title"
        tools:layout = "@layout/fragment_login_code" />

</navigation>

LoginPhoneNumberFragment:

val action = LoginPhoneNumberFragmentDirections.actionLoginPhoneNumberFragmentToLoginCodeFragment(prefix, phoneNumber)
view?.findNavController()?.navigate(action)

ЛогинКодФрагмент:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val prefix = LoginCodeFragmentArgs.fromBundle(arguments).prefix //LoginCodeFragmentArgs is not recognized

    }

В LoginPhoneNumberFragment он создает класс «LoginPhoneNumberFragmentDirections», но в целевом классе LoginCodeFragment он не распознает «LoginCodeFragmentArgs».

Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает? (Я очистил и перестроил и попробовал Invalidate caches...)

13
0
3 684
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Итак, после долгих поисков я обнаружил свою ошибку - аргументы должны быть на фрагменте Назначения, а не на стартовом:

<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_graph"
    app:startDestination = "@id/loginPhoneNumberFragment">

    <fragment
        android:id = "@+id/loginPhoneNumberFragment"
        android:name = "...fragments.LoginPhoneNumberFragment"
        android:label = "@string/login_activity_title"
        tools:layout = "@layout/fragment_login_phone_number">
        <action
            android:id = "@+id/action_loginPhoneNumberFragment_to_loginCodeFragment"
            app:destination = "@id/loginCodeFragment">
        </action>
    </fragment>

    <fragment
        android:id = "@+id/loginCodeFragment"
        android:name = "...fragments.LoginCodeFragment"
        android:label = "@string/login_activity_title"
        tools:layout = "@layout/fragment_login_code" >
        <argument
            android:name = "prefix"
            app:argType = "string"
            android:defaultValue = "888" />
        <argument
            android:name = "phone_number"
            app:argType = "string"
            android:defaultValue = "88888888"/>
    </fragment>

</navigation>

Вы также можете добавить его вручную через дизайн навигационного графа - нажмите на целевой фрагмент и нажмите «+» в разделе аргументов, он добавит его в текстовый файл.

Кроме того, это не должно быть в теге «действие».

Cembora 25.01.2020 11:54

Спасибо за это! Это действительно не так ясно в документации...

najm 10.12.2020 20:24

Ты спас мою жизнь

Alex Rivas 31.05.2021 17:35

Отлично! Эти две строки должны быть включены в официальную документацию и также исправить неправильный пример.

Davide 26.09.2021 17:05

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

<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_graph"
    app:startDestination = "@id/loginPhoneNumberFragment">

    <fragment
        android:id = "@+id/loginPhoneNumberFragment"
        android:name = "...fragments.LoginPhoneNumberFragment"
        android:label = "@string/login_activity_title"
        tools:layout = "@layout/fragment_login_phone_number">
        <action
            android:id = "@+id/action_loginPhoneNumberFragment_to_loginCodeFragment"
            app:destination = "@id/loginCodeFragment"/>
    </fragment>

    <fragment
        android:id = "@+id/loginCodeFragment"
        android:name = "...LoginCodeFragment"
        android:label = "@string/login_activity_title"
        tools:layout = "@layout/fragment_login_code">
            <argument
                android:name = "prefix"
                app:argType = "string" />
            <argument
                android:name = "phone_number"
                app:argType = "string" />
     </fragment>
</navigation>

Другие вопросы по теме