0
1

More than 1 year has passed since last update.

Kotlin Parcelable の独自実装の方法

Last updated at Posted at 2021-09-12

はじめに

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

参考

Parcelable 実装生成ツール | Android デベロッパー | Android Developers

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1