导航体系结构组件-DestinationFragmentArgs未生成

时间:2019-05-29 12:30:38

标签: android kotlin navigation android-architecture-navigation

我在应用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)

LoginCodeFragment:

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”。

有人可以告诉我我想念什么吗? (我清理并重建,并尝试了使缓存无效...)

2 个答案:

答案 0 :(得分:1)

该参数应位于目标片段中,如下所示,而不是位于源片段中的动作中

<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>

答案 1 :(得分: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">
        </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>

您也可以通过导航图设计手动添加它-按下目标片段,然后在参数部分按下“ +”,它将添加到文本文件中。