iOS開発者のAndroid開発入門その9(ViewModel〜ViewModelを使いたい〜)

botman3 Android

はじめに

今回は ViewModel, LiveData, DataBinding について書いていきます。もうこの3つは常にセットで使うと言っても過言ではないと思います。(。。。たぶん)色々サイト見てみましたが小難しいのでとりあえず使えるようになるのを目標にして詳細はもっと成熟してから追記したいと思います。

Android のデファクトスタンダードは MVVM っぽいのでほぼ全てのアプリで利用すると思っていいはず。

色々見ても混乱するだけなので今回は主に下記の動画を参考にしています。なのでとりあえず ViewModel 使いたければ下記の動画見ればいいと思います!

ゆるっとAndroid ViewModel開発の解説ライブコーディング

GitHubにサンプルつくったのでよかったらどうぞ↓↓↓
GitHub のサンプル

ViewModel

MVVM における ViewModel だと思って問題ないはず。Activity に直接 String などで値を持っている場合は画面回転時など onSaveInstanceState で値を保持してあげないといけないが ViewModel を利用すればそういったことは気にする必要がなくいい感じに値を保持してくれる。

ViewModel の詳細は下記をどうぞ

LiveData

ライフサイクルに応じたデータ監視ができるやつ。ViewModel の値を View が監視するために使う。

LiveData の詳細は下記をどうぞ

DataBinding

XML の View と ViewModel をバインディングするためのやつ。各種設定をしているとビルド時に 〜Binding というクラスを自動生成してくれる。

DataBinding の詳細は下記をどうぞ

使い方

1.build.gradleの修正

build.gradle に DataBinding 用に下記を追記する

2.Fragmentの作成

New -> Fragment -> Fragment (with ViewModel) で Fragment を追加する (MainFragmeng.kt)

fragment

build.gradle に下記が追加されているはず

3.Bindingクラスの作成

Fragment の XML のルートを <layout></layout> に変更して下記を追加する

これでビルドすれば MainFragmentBinding クラスができているはず

4.Fragmentの修正

Fragment を下記のように修正する

5.ViewModelの修正

ViewModel を下記のように修正する

6.FragmentのXMLの修正

Fragment の XML を下記のように修正する

7.値の監視

Fragment に下記のように書けば message を監視できます

これで簡単な使い方は完璧なはず!

ViewModel の MutableLiveData 外部の公開する必要がないので下記のように MutableLiveData は private にして LiveData を公開する方がよさそう(ReactiveSwift とかと同じ感じ)

mutableMessage じゃなくて _message とする方が一般的かもしれないがわからない。。。

LiveDataをイベントで利用する場合の注意

参考動画でも言及されていますがボタンのクリックイベントなどで LiveData を利用して Observe する場合は注意が必要なようです。

ViewModel を参照すると Observe してたら毎回値が流されるらしい。。。動画のように Navigation で Fragment 切り替えをやるとバックキーで戻るとまた値が流れてしまうらしい。詳しくは動画でどうぞ。(画面回転時とかも値が流れてしまうはず)

対策としては google/iosched/Event.kt を使う方法があるみたいです。

Event.kt をプロジェクトに追加して下記のように Event を使うようにします。

これで値に変更があった場合にしか post されないようです。

ViewModelProvidersが非推奨

どうやら ViewModelProviders が非推奨のようなので ViewModel の生成部分を修正する必要があります。

単純なのはこう

[Android]lifecycleライブラリ2.2.0からViewModelProviders.ofが非推奨になっちゃった件を参考にすると

build.gradle に下記を追加して

下記のようにする方法もあるようです。

どっちがいいのかはちょっとわからないです。(どう違うのかもよくわからないですが val にできる後者の方が個人的に好きです)

おわりに

バインディングが簡単にできるので MVVM 構成がさくっとできるのはいいですね!ViewModel 使えばめんどくさい画面回転とかのライフサイクル関連もあまり気にしなくてよさそうなので積極的に使っていきたいですね。

ViewModel と Navigation を使えばわりと iOS と同じ感覚で実装できそうな気もします。

とりあえず ViewModel 使いたければ下記の動画見ればいいと思います!

ゆるっとAndroid ViewModel開発の解説ライブコーディング

参考

Amazon.co.jp

コメント

タイトルとURLをコピーしました