Open mkurom opened 2 years ago
データバインディンの書き方 ●xml
nameはxml内のコンポーネントにバインドするときの使用する名前 type= パッケージ名.クラス名
パッケージ名はディレクトリも含む androidではディレクトリをパッケージと呼ぶ
上記の例では アプリのパッケージ:com.example.mvvmsampleapp パッケージ名(ディレクトリ):viewmodel クラス名:MainViewModel
TextViewにバインドするときは以下のようにする
<TextView android:text="@{viewModel.liveData}" />
「nameで設定した名前.viewmodelクラスにある変数」で設定する
ViewModel
アクティビティやフラグメントに以下のようにして、アタッチする
private val viewModel: HogeViewModel by viewModels()
HogeViewModelクラスのViewModelを生成して、アクティビティやフラグメントにメンバー変数として記載する
上のサンプルは下記のように定義されている var property-name : property-type by delegate-class()
viewModelにアクセスすると、viewModelsによって処理される。 そのため、デバイスの回転などによって、アクティビティの再構成時にviewmodelが再作成されずにviewModelsから値を返すことができる。 アクティビティの再構成時にviewModelsがないと、参照の状態を無くし、viewmodelを再作成するようになってしまう。
参考:https://developer.android.com/codelabs/basic-android-kotlin-training-viewmodel#3
https://developer.android.com/codelabs/basic-android-kotlin-training-viewmodel#5
var と valについて
varプロパティはgetter, setterが自動的に生成される
valプロパティはgetterのみ自動的に生成される
●バッキングプロパティ
private var _count = 0
val count: Int get() = _count
プライベート変数の_cpuntはクラス内部から変更できるが、countは外部から参照しかできない。
●モデルのクラス作成について
data class とclassがある
以下のドキュメントを参考 https://kotlinlang.org/docs/data-classes.html
参考記事 https://qiita.com/kaleidot725/items/82510dde1082acddf8be https://qiita.com/reo-androider/items/44d4e957173d520fb2ed
data class のcopy関数はインスタンスの参照ではなく、別のインスタンスとしてコピーしているので、ディープコピー? なので、イミュータブルな値として取得するのに便利。(Flutter でいうところのfreezed的な感じ?)
●Android Architecture Component(AAC)
・LiveData:監視可能なデータホルダークラス →オブザーバーパターン的なもの?
●Data Binding ・UI(XML)にdataタグを利用して、記述する layoutタグの内側に書くが、CoordinatorLayoutタグの外側に書くので注意 双方向がMutableLiveData、単方向がLiveData?
・データバインディング用のxmlファイルを生成すると、自動的に「ファイル名+Binding」というクラスが生成される 例)new/Fragment/Fragment with ViewModelで生成 main_fragment.xmlを生成するとMainFragmentBindingクラスが生成される
●Kotlin Coroutines ・スレッド? ・launch, runBlocking, async, awaitを使用して、Coroutinesを開始する