Kotlin Multiplatform 에서 Parcelable + Parcelize 사용하기

TYLENOL
Oct 31, 2020

문서도 잘 없고 할 줄도 모르는 너무 어려운 KMM

여기를 참고함

원리는 심플하게, expect 와 actual 키워드를 사용한다.

iOS 에는 Parcelable 같은게 없기 때문에 OptionalExpectation 로 무효화하고, Android 에만 typealias 로 구현을 함.

Kotlin Android Extensions 세팅하기

plugins {
kotlin("multiplatform")

//...
id("kotlin-android-extensions")
}

// ...
android { // ... androidExtensions {
isExperimental = true
}
}

Shared Module 의 build.gradle(kts) 에 다음과 같이 세팅
kotlin-android-extensions 의 Experimental feature 로 @Parcelize 를 사용하고자 한다.

Shared 코드 작성하기


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

Shared Module 에 두 코드를 추가함.

Parcelable 은 실제 Android 의 android.os.Parcelable 가 될 친구이고,
Parcelize 는 아까 세팅한 플러그인의 kotlinx.android.parcel.Parcelize 가 될 친구이다.

Parcelize Annotation 의 경우에는 iOS 에서는 무용지물이므로 @OptionalExpectation 를 추가하여 따로 actual 코드를 작성하지 않게 한다.

Android 코드 작성하기

actual typealias Parcelize = kotlinx.android.parcel.Parcelize

actual typealias Parcelable = android.os.Parcelable.Parcelable

Android 모듈에서 actual 키워드로 다음과 같이 typealias 를 해준다.

iOS 코드 작성하기

actual interface Parcelable

iOS 에서는 Parcelable 이 필요가 없으므로 그냥 빈 깡통을 만들어준다.

결론

와우 잘된다!

--

--