我正在开发一个 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
提前感谢您的帮助!