KotlinとDataBindingのその後

Adways Advent Calendar 2日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar/archive


こんにちは、梅津です。

みなさん、Kotlin触ってますか?
私は個人的にやるプロジェクトでは必ずKotlinで始めるようにしたり、会社のプロジェクトでも一部分で導入してみたりと、毎日少しはKotlinに触れるような日々を送っております。

さて、私は以前 KotlinでDataBindingを使ってみたらハマったこと という記事を書いたのですが、最近ではこの辺の状況が変わってきました。
今回はKotlinとDataBindingを取り巻く環境がどんなふうに変わったのか紹介したいと思います。

1. カスタムセッターは拡張関数で

以前の記事ではカスタムセッターを作るためにobject宣言と@JvmStaticというアノテーションを使って実現しました。
その後、Kotlinスタートブックを読んで知ったのですが、カスタムセッターを作るなら拡張関数を使う方が良さそうです。

@BindingAdapter("imageUrl")
fun ImageView.loadImage(url: String) {
    Glide.with(context).load(url).into(this)
}

拡張関数を使ったコードをコンパイルすると、レシーバ(この場合はImageView)を第一引数に取るstaticなメソッドが作られます。
結果的にobject宣言 + @JvmStaticでやっていた時と同じようなコードが生成されるため、Java側から問題なく呼び出すことができます。
こっちの方がKotlinっぽいし、何よりJavaからどうやって呼ばれるのか?ということを意識しなくて良くなりました!

2. kaptがいい感じになった

Kotlin 1.0.4が出た時にkaptも改善されました。
以前まで設定していた generateStubs は削除して、代わりに下記のコードを追加しましょう。

apply plugin: 'kotlin-kapt'

最終的なapp/build.gradleは以下のようになります。
(最近はext.kotlin_versionをルートのbuild.gradleに書くこともあると思います。その場合は適宜読み替えてください)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
+ apply plugin: 'kotlin-kapt'

android {
    ...

    dataBinding {
        enabled = true
    }
}

dependencies {
    kapt 'com.android.databinding:compiler:2.2.2'
}

buildscript {
    ext.kotlin_version = '1.0.5-2'  // 1.0.x系で今のところの最新

    ...
}

- kapt {
-    generateStubs = true
- }

基本的にKotlinでAnnotation Processorを使う場合はkotlin-kaptをapplyすれば良くなります。
これでおまじないのように書いていたgenerateStubsが消えて直感的になりました!

3. コードが真っ赤になってたアレが解消された

KotlinとDataBindingで開発している時に何が辛かったかというと、生成されたBindingクラスのメソッドやプロパティが見つからないと言われてコード中に赤線が出まくることでした。
IDEではエラーになっているのに実行することはできる、という中々カオスな状況でしたね。
しばらくすると慣れてきて「あー。いつもの模様か」となってくるんですが、できたらそんな赤線は見ないで開発したいわけです。
それがついにKotlin 1.0.5で解消されました!さらば赤線!
これでストレスなく開発していくことができそうです。

まとめ

以前までは自分自身の知識不足だったりKotlinのツール側がイマイチだったりで、「開発はできるけど、もうちょっと気持ち良く書けるようにならないかなー?」といった部分がありました。
しかし、今となってはそれらの部分は解消されています。
KotlinでDataBindingをするなら今が一番始めやすいのではないでしょうか。

何よりKotlinサイコーなので使う人がもっと増えると嬉しいです。

それでは、また。


次は大野さんの記事です!

http://blog.engineer.adways.net/entry/advent_calendar/03