mkurom / Kotlin_sampleApp

Kotlin勉強用
1 stars 0 forks source link

MVVMについて調べる #14

Open mkurom opened 2 years ago

mkurom commented 2 years ago

●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を開始する

mkurom commented 2 years ago

データバインディンの書き方 ●xml

nameはxml内のコンポーネントにバインドするときの使用する名前 type= パッケージ名.クラス名

パッケージ名はディレクトリも含む androidではディレクトリをパッケージと呼ぶ

上記の例では アプリのパッケージ:com.example.mvvmsampleapp パッケージ名(ディレクトリ):viewmodel クラス名:MainViewModel

TextViewにバインドするときは以下のようにする

<TextView android:text="@{viewModel.liveData}" />

「nameで設定した名前.viewmodelクラスにある変数」で設定する

mkurom commented 2 years ago

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

mkurom commented 2 years ago

var と valについて

varプロパティはgetter, setterが自動的に生成される

valプロパティはgetterのみ自動的に生成される

●バッキングプロパティ

private var _count = 0

val count: Int get() = _count

プライベート変数の_cpuntはクラス内部から変更できるが、countは外部から参照しかできない。

mkurom commented 2 years ago

●モデルのクラス作成について

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的な感じ?)