KotlinでDatabaseException: mypackage.Item does not define a no-argument constructor.

状況

Android Studio: 3.0.1
Kotlin: 1.2.10
firebase-database: 11.8.0

現象

Kotlinの勉強がてらFirebaseのRealTime Databaseでデータを取得しようとしたらこんなエラーが出た。

com.google.firebase.database.DatabaseException: Class my.com.package.Item does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
    at com.google.android.gms.internal.zzelx.zze(Unknown Source)
    at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
    at com.google.android.gms.internal.zzelw.zza(Unknown Source)
    at com.google.android.gms.internal.zzelw.zza(Unknown Source)
    at com.google.android.gms.internal.zzelw.zza(Unknown Source)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
    at my.package.MyListFragment$fetchData$1.onDataChange(MyListFragment.kt:83)
    at com.google.android.gms.internal.zzegf.zza(Unknown Source)
    at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source)
    at com.google.android.gms.internal.zzeig.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

※パッケージやクラス名は変更している

firebaseからの取得コードはこれ

    /**
     * 一覧に表示するデータを取得
     */
    private fun fetchData() {
        // Write a message to the database
        val database = FirebaseDatabase.getInstance()
        val myRef = database.getReference(mPath)

        // Read from the database
        myRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                val items: List<Item>? = dataSnapshot.getValue(object : GenericTypeIndicator<ArrayList<Item>>() {})
                Log.d(TAG, "Value is: " + items)
                recyclerView!!.adapter = MyRecyclerViewAdapter(items!!, mListener)
            }

            override fun onCancelled(error: DatabaseError) {
                // Failed to read value
                Log.w(TAG, "Failed to read value.", error.toException())
            }
        })
    }

エラーメッセージのみ抜き出すと
Class my.com.package.Item does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.

日本語に訳すと
クラスmy.com.package.Itemは、引数のないコンストラクタを定義しません。 ProGuardを使用している場合は、これらのコンストラクタが削除されていないことを確認してください。

解決方法

引数のないコンストラクタ…
もしかしてモデルとして作ったItemクラスがおかしいのか?
と思い見てみると、ああ、Boolean型のisVideoに初期値を定義していなかった。

// 修正前
data class Item(
        val caption: String = "",
        val code: String = "",
        val data: String = "",
        val isVideo: Boolean,  // ←こいつの初期値がないのが原因
        val thumbnail: String = ""
)

とりあえずfalseでも突っ込んでおく

// 修正前
data class Item(
        val caption: String = "",
        val code: String = "",
        val data: String = "",
        val isVideo: Boolean = false,  //初期値falseを追加
        val thumbnail: String = ""
)

ビルドして動作させると...動いた!

モデルのコンストラクタに初期値を忘れるとこうなるんだな、勉強になった。