Как использовать safe-args с сериализуемыми данными MPP - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь использовать safe-args с kotlin -мультиплатформенными типами, однако я продолжаю получать ту же проблему во время выполнения при попытке передать сериализуемые данные:

Причина: java .lang.IllegalArgumentException: org. kotlin .mpp.mobile.models.MyModel не может быть сериализуемым или разборчивым.

В моем nav_host. xml I иметь следующее:

<fragment
    android:id="@+id/aFragment"
    android:name="com.corp.myapp.main.aFragment"
    android:label="aFragment" >
    <action
        android:id="@+id/action_aFragment_to_bFragment"
        app:destination="@id/bFragment"
        app:popUpTo="@id/bFragment"
        app:popUpToInclusive="true">
        <argument
            android:name="myname"
            app:argType="org.kotlin.mpp.mobile.models.MyModel"
            app:nullable="true" />
    </action>
</fragment>

Два подхода, которые я сейчас использую, где я получаю точно такое же исключение.

Первый - использование kotlinx-сериализация плагин, где у меня есть следующий тип:

package org.kotlin.mpp.mobile.models

import kotlinx.serialization.Serializable

@Serializable
data class MyModel(val first: String = "", val last: String = "")

Второй, который я попробовал как первый, не работал, это сделать реализацию платформы c (JVM) с расширением java .io.Serializable со следующими данными:

commondataModels.kt:

package org.kotlin.mpp.mobile.models

expect class MyModel(first: String, last: String)

actualdataModels.kt:

package org.kotlin.mpp.mobile.models

import java.io.Serializable

actual data class MyModel actual constructor(val first: String, val last: String): Serializable

Я выполняю навигационный вызов в своей Деятельности с созданным классом направления:

import org.kotlin.mpp.mobile.models.*


val user = MyModel("Bruce","Lee")
host.findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(user))

Заранее благодарен за любой совет!

ПРИМЕЧАНИЕ: я могу заставить все работать, передав пакет с API навигации , однако я хотел бы, чтобы он работал с safe-args .

1 Ответ

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

Как рекомендует CommonsWare, используйте @Parcelize (и, соответственно, Parcelable)

enter image description here

Хитрость заключается в том, чтобы Parcelable не сломался Ваш общий код, так как это Android единственная концепция. Для этого в свой общий код добавьте

ожидаемый интерфейс Parcelable

, а также:

@ UseExperimental (ExperimentalMultiplatform :: class) @OptionalExpectation @Target (AnnotationTarget.CLASS) @Retention (AnnotationRetention.BINARY) ожидаемый класс аннотаций Parcelize ()

будет выглядеть следующим образом: enter image description here

Затем в вашем Android исходном наборе фактические typealias:

фактические typealias Parcelable = android .os.Parcelable

фактические typealias Parcelize = kotlinx. android. parcel.Parcelize

В других наборах источников (например, iOS) просто введите это в факт:

фактический интерфейс Parcelable

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