Аргумент safeargs не найден в NavDirections - PullRequest
0 голосов
/ 29 апреля 2020

Я реализовал аргумент, который должен передаваться между фрагментами в nav_graph, однако, когда я пытаюсь установить аргумент в исходном фрагменте, аргумент не найден в NavDirections.

Обратите внимание, что навигация до этого работала нормально пытаюсь передать аргумент.

Если я делаю Чистый Проект, я теряю NavDirections. Если я делаю Перестройку, я теряю аргумент.

Gradle: app

    //Navigation
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
    apply plugin: "androidx.navigation.safeargs.kotlin"

nav_graph. xml

    <fragment
        android:id="@+id/destination_home"
        android:name="com.android.joncb.flightlogbook.HomeFragment"
        android:label="@string/lblHome"
        tools:layout="@layout/fragment_home">
        <action
            android:id="@+id/action_home_to_fltHistory"
            app:destination="@id/destination_fltHistory" />
        <action
            android:id="@+id/action_home_to_stats"
            app:destination="@id/destination_statistics" />
        <action
            android:id="@+id/action_home_to_newFlight"
            app:destination="@id/destination_newFlight" />
        <action
            android:id="@+id/action_home_to_fltDetails"
            app:destination="@id/destination_fltDetails" />
        <argument
            android:name="fltData"
            app:argType="string" />
    </fragment>

и в моем Домашнем фрагменте я получаю ошибка "Неразрешенная ссылка: fltData"

        card_nextFlight.setOnClickListener {
            val actionDetails = HomeFragmentDirections.actionHomeToFltDetails()
            actionDetails.fltData ( flightData.toString())

            Navigation.findNavController(it).navigate(actionDetails)
        }

flightData - класс данных

data class FlightDTO(
    var airlineName: String, var faCode: String, var fltNo: String, var aircraft: String,
    var depAP: String, var arrAP: String, var schedDep: String, var schedArr: String,
    var date: String, var leg: Int = 0, var actDep: String = "", var actArr: String = "" ){

...

    override fun toString(): String {

        return "$airlineName $faCode $fltNo $aircraft $depAP $schedDep $arrAP $schedDep $date"
    }
}

Я хочу в идеале передать класс, сделав класс Parcelable, но пока не смогу передать строку , нет смысла рисковать по линии посылки.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вы пишете свои XML неправильно, думайте так: То, как я структурирую свои XML свойства, - это то, как сгенерированный код будет выглядеть и получаться между получателями своего рода ...

Таким образом, в основном в вашем nav_graph. xml вы должны изменить на:

<fragment
    android:id="@+id/destination_home"
    android:name="com.android.joncb.flightlogbook.HomeFragment"
    android:label="@string/lblHome"
    tools:layout="@layout/fragment_home">
    <action
        android:id="@+id/action_home_to_fltHistory"
        app:destination="@id/destination_fltHistory" />
    <action
        android:id="@+id/action_home_to_stats"
        app:destination="@id/destination_statistics" />
    <action
        android:id="@+id/action_home_to_newFlight"
        app:destination="@id/destination_newFlight" />
    <action
        android:id="@+id/action_home_to_fltDetails"
        app:destination="@id/destination_fltDetails">
        <argument
            android:name="fltData"
            app:argType="string" />
    </action>
</fragment>

и в пункте назначения он должен выглядеть примерно так:

<fragment
    android:id="@+id/destination_fltDetails"
    android:name="com.android.joncb.flightlogbook.FlightDetailsFragment"
    android:label="@string/lblFlightDetails"
    tools:layout="@layout/fragment_flight_details">
    <argument
        android:name="fltData"
        app:argType="string" />
</fragment>

и в вашем Фрагмент сведений о полете, свойства которого получены с помощью:

private val args: FlightDetailsFragmentArgs by navArgs()
println(args.fltData) // prints the navigation data

ОБНОВЛЕНИЕ:

Забыл упомянуть ваш OnClickListener в вашем фрагменте Home, который будет выглядеть примерно так:

card_nextFlight.setOnClickListener {
    val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(flightData.toString())

    Navigation.findNavController(it).navigate(actionDetails)
}
0 голосов
/ 01 мая 2020

Вместо того, чтобы передать класс данных, я создал JSON String и передал строку

        card_nextFlight.setOnClickListener {
            val dataString = flightData.toJSONString()
            val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(dataString)

            Navigation.findNavController(it).navigate(actionDetails)
        }

Чтобы заставить это работать, мне пришлось изменить функцию actionHomeToFltDetails, чтобы получить строку в HomeFragmentsDirections

    fun actionHomeToFltDetails(fltData: String): NavDirections = ActionHomeToFltDetails(fltData)
  }

Я не смог заставить подход @Lucho обработать arg в целевом фрагменте, чтобы работать так, чтобы вернуться к управлению пакетами, и преобразовал строку JSON обратно в класс данных

        const val ARG_PARAM1 = "fltData"
.
.
.
        arguments?.let {
            argFltData = it.getString(ARG_PARAM1)

            Log.e("args","Passed Argument: $argFltData")

            fltData = gson.fromJson(argFltData, FlightDTO::class.java)

        }

Еще раз спасибо за ваш вклад, и я надеюсь, что это поможет кому-то еще через драму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...