はじめに
Parcelable の独自実装の方法について調べたことを記事として残します。
インストール方法
プロジェクトのテンプレートで「Empty Compose Activity」を選択した場合、次のコードを build.gradle に追加するだけで設定が完了します。
plugins {
id 'kotlin-parcelize'
}
自作クラスを Parcelable にする方法
次のコードは、Foo
クラスを Parcelable にするコードです。
@Parcelize
class Foo : Parcelable {
private companion object : Parceler<Foo> {
override fun create(parcel: Parcel): Foo {
TODO()
}
override fun Foo.write(parcel: Parcel, flags: Int) {
TODO()
}
}
}
create
はデコード時に呼ばれるメソッド、write
はエンコード時に呼ばれるメソッドだと思います。
既存クラスを Parcelable にする方法
Parceler<T>
を実装したシングルトンオブジェクトを作成し、型を @WriteWith<*>
で装飾すると Parcelable になります。
// Bar クラスは既存クラスという想定
class Bar
object BarParceler : Parceler<Bar> {
override fun create(parcel: Parcel): Bar {
TODO()
}
override fun Bar.write(parcel: Parcel, flags: Int) {
TODO()
}
}
typealias ParcelableBar = @WriteWith<BarParceler> Bar
// 次のように使用する
@Parcelize
data class Baz(val bar: ParcelableBar) : Parcelable
@WriteWith<*>
が複数並ぶ場合は @TypeParceler<*, *>
を使うことで簡潔に書けます。
@Parcelize
data class MyData(
val instant1: @WriteWith<InstantParceler> Instant,
val instant2: @WriteWith<InstantParceler> Instant,
val instant3: @WriteWith<InstantParceler> Instant,
) : Parcelable
// ↑ と ↓ は等価
@Parcelize
@TypeParceler<Instant, InstantParceler>
data class MyData(
val instant1: Instant,
val instant2: Instant,
val instant3: Instant,
) : Parcelable