0

我正在开发一个 Kotlin Multiplatform 项目,我尝试在其中进行一些网络调用并保存到 SQLDelight 数据库中。

因此,我尝试使用 kmm 的实际/预期行为创建自定义 Parcelable 和 Pacelize。

因此,在我的 androidApp 模块中,我声明了我的自定义 Parcelize 和 Parcelable 实际实现:

actual typealias CommonParcelize = Parcelize
actual typealias CommonParcelable = Parcelable

在我的 commonMain 模块中:

@OptIn(ExperimentalMultiplatform::class)
@OptionalExpectation
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
expect annotation class CommonParcelize()

@Suppress("NO_ACTUAL_FOR_EXPECT")
expect interface CommonParcelable

@Suppress("NO_ACTUAL_FOR_EXPECT") 我必须添加,因为我没有配置实际的 ios 部分。

我正在使用的模型类如下:

package com.jshvarts.kmp.model

import com.jshvarts.kmp.android.plataform.CommonParcelize
import com.jshvarts.kmp.android.plataform.CommonParcelable

@CommonParcelize
data class UnsplashPhoto(
  val id: String?,
  var description: String?,
  val urls: UnsplashPhotoUrls,
  val user: UnsplashUser
) : CommonParcelable {
  @CommonParcelize
  data class UnsplashPhotoUrls(
    val raw: String,
    val full: String,
    val regular: String,
    val small: String,
    val thumb: String
  ) : CommonParcelable

  @CommonParcelize
  data class UnsplashUser(
    val name: String,
    val username: String
  ) : CommonParcelable {
    val attributionUrl get() =
      "https://unsplash.com/$username?utm_source=ImageSearchApp&utm_medium=referral"
  }
}

因此,关于 android 应用程序,当我启动并恢复网络响应时,我收到以下错误:

INFO io.ktor.client.HttpClient - RESPONSE https://api.unsplash.com/search/photos?query=cats&page=1&per_page=10 failed with exception: kotlinx.serialization.SerializationException: Can't locate argument-less serializer for class UnsplashPhoto. For generic classes, such as lists, please provide serializer explicitly.

当我使用@Serializable 注释而不是@Parcelize 和@Parcelable 注释时,错误引用了一个错误。

所以我不知道你是否有在 kmm 中这样的一些实现的经验,但无论如何,提前谢谢!

[编辑]

我做了一些更新,删除了期望接口 Parcelable 中的 @Suppress("NO_ACTUAL_FOR_EXPECT") ,并且我在 ios 部分中将其实现为空的实际:

`//IOSMain
actual interface CommonParcelable

我的另一个实际的常见模块是:

//Common

@OptIn(ExperimentalMultiplatform::class)
@OptionalExpectation
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
expect annotation class CommonParcelize()

expect interface CommonParcelable

和安卓模块

//Android
actual typealias CommonParcelable = Parcelable

actual typealias CommonParcelize = Parcelize

而且我仍然收到此错误,因为 IOSMain 中不存在 CustomParcelable 类:

Expected interface 'CommonParcelable' has no actual declaration in module KmpMVVMGooglePay.shared.iOSMain for Native

提前感谢您的帮助!

4

0 回答 0