👌
Android Firestoreでdata class利用時、プロパティ名にisを付けるならJvmFieldも付ける
プロパティ名にisFoo
と名づけることは珍しくないと思いますが、Firestore を利用する際には注意が必要です。
プロパティ名に is を付けるなら JvmField も付けよう
例えば、以下のケースではisDone
という名前をつけていますが、@field:JvmField
を付与しないと Firestore のtoObject(Task::class.java)
で正常にパースできません。
data class Task(
@DocumentId val documentId: String? = null,
val title: String = "",
@field:JvmField // use this annotation if your Boolean field is prefixed with 'is'
val isDone: Boolean = false,
)
なぜか
通常 Kotlin でプロパティを宣言すると、Java 向けに getter/setter が生成され、Java からは getter/setter を通してアクセスすることになります。
しかしisFoo
で生成される getter/setter が Firestore とコンフリクトしてしまっているようです。
@field:JvmField
を付与すると Java からも直接アクセスできるので、問題は回避できます。
Firebase のドキュメントでも同様のコードで書かれています。
その他参考にしたサイト
Discussion