如何在Kotlin多平台项目共享模块中使用@Parcelize注释

您所在的位置:网站首页 基金年底排行榜前十名有哪些公司 如何在Kotlin多平台项目共享模块中使用@Parcelize注释

如何在Kotlin多平台项目共享模块中使用@Parcelize注释

#如何在Kotlin多平台项目共享模块中使用@Parcelize注释| 来源: 网络整理| 查看: 265

这些片段向您展示了如何在KMM项目中为任何类型的类(包括原语)使用Android。它向我们展示了注解、接口、泛型、对象、@TypeParceler、Parceler、Parcelable、Parcelize,以及如何为通用代码、iOS和Android实现每个平台。

这是必要的代码,以防止崩溃时,Android应用程序的背景和Parceler是自动运行保存状态。

在本例中,我希望是LocalDateTime的非本地parcelable类作为非本地parcelable类的示例。您可以使用任何类,只需更改实现即可。

在build.gradle.kts(:shared)中

plugins { kotlin("multiplatform") id("com.android.library") id("kotlin-parcelize") // add this id("kotlin-kapt") // add this // ...rest of defintions... } kotlin { android() listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" } } sourceSets { val commonMain by getting { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") // LocalDateTime library written in Kotlin (can't use java libraries) } } // ...rest of definitions... } // ...rest of definitions... }

在commonMain/.../Platform.kt中

import kotlinx.datetime.LocalDateTime // For Android @Parcelize @OptIn(ExperimentalMultiplatform::class) @OptionalExpectation @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.BINARY) expect annotation class CommonParcelize() // For Android Parcelable expect interface CommonParcelable // For Android @TypeParceler @OptIn(ExperimentalMultiplatform::class) @OptionalExpectation @Retention(AnnotationRetention.SOURCE) @Repeatable @Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) expect annotation class CommonTypeParceler() // For Android Parceler expect interface CommonParceler // For Android @TypeParceler to convert LocalDateTime to Parcel expect object LocalDateTimeParceler: CommonParceler

在androidMain/.../Platform.kt中

重要注意事项:必须导入kotlinx.parcelize.* 而不是 kotlinx.android.parcel.*

import android.os.Parcel import android.os.Parcelable import kotlinx.datetime.LocalDateTime import kotlinx.datetime.toLocalDateTime import kotlinx.parcelize.Parceler import kotlinx.parcelize.Parcelize import kotlinx.parcelize.TypeParceler actual typealias CommonParcelize = Parcelize actual typealias CommonParcelable = Parcelable actual typealias CommonParceler = Parceler actual typealias CommonTypeParceler = TypeParceler actual object LocalDateTimeParceler : Parceler { override fun create(parcel: Parcel): LocalDateTime { val date = parcel.readString() return date?.toLocalDateTime() ?: LocalDateTime(0, 0, 0, 0, 0) } override fun LocalDateTime.write(parcel: Parcel, flags: Int) { parcel.writeString(this.toString()) } }

在iosMain/.../Platform.kt中

import kotlinx.datetime.LocalDateTime // Note: no need to define CommonParcelize here (bc its @OptionalExpectation) actual interface CommonParcelable // not used on iOS // Note: no need to define CommonTypeParceler here (bc its @OptionalExpectation) actual interface CommonParceler // not used on iOS actual object LocalDateTimeParceler : CommonParceler // not used on iOS

在../shared/commonMain/.../domain/note/Note.kt中

这是您的域类,将由iOS和Android共享。

import kotlinx.datetime.LocalDateTime @CommonParcelize data class Note( val id: Long?, val title: String, val content: String, val colorHex: Long, @CommonTypeParceler() val created: LocalDateTime, ): CommonParcelable { companion object { private val colors = listOf(RedOrangeHex, RedPinkHex, LightGreenHex, BabyBlueHex, VioletHex) fun generateRandomColor() = colors.random() } }

我试图实现@RawValue,但是它没有文档化(AFAIK),上面使用@TypeParcelers的方法对于任何特定的类都很有效。我把它留给别人做练习!

样本项目:https://github.com/realityexpander/NoteAppKMM



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3