メモ > 技術 > IDE: AndroidStudio > アプリの作成(Jetpack Compose / ビューモデルを扱う)
■アプリの作成(Jetpack Compose / ビューモデルを扱う)
※未検証
ViewModel の概要 | Android デベロッパー | Android Developers
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja
#69 Jetpack ComposeでToDoアプリを作る - HiltとViewModel | Mokelab Blog
https://blog.mokelab.com/69/compose_todo7.html
とにかく簡単にViewModelまとめ - Qiita
https://qiita.com/KIRIN3qiita/items/7d833e2c010c0b2c02d9
ViewModelの採用が必須というわけでも無いらしい
Jetpack ComposeでViewModelを使わずに、Composable関数を使って状態とロジックを切り出す! - Qiita
https://qiita.com/karamage/items/9b2b5a79c364b72836d4
「SwiftUIでMVVMを採用するのは止めよう」と思い至った理由 - Qiita
https://qiita.com/karamage/items/8a9c76caff187d3eb838
ViewModel を捨てて マルチプラットフォーム に備える
https://android.benigumo.com/20220928/without-viewmodel/
以下、ViewModelを使わずにComposable関数で対応する場合のコード
■カウントアップするプログラム
@Composable
fun MainScreen() {
Column {
var count by remember { mutableStateOf(0) }
Text("ボタンのタップ回数: $count")
Button(
onClick = { count++ }
) {
Text("カウントアップ")
}
}
}
※上記コードでは、画面が回転したときに値が失われる
「by remember」の代わりに「by rememberSaveable」にすると、画面が回転しても値を保持できる
ただし rememberSaveable は Parcelable しか保存できないので、オブジェクトを保存したい場合は Parcelable にシリアライズする必要があるらしい(未検証)
■状態とロジックを切り離す
@Composable
fun MainScreen() {
Column {
val counter = rememberCounter()
Text("ボタンのタップ回数: ${counter.count}")
Button(
onClick = { counter.increment() }
) {
Text("カウントアップ")
}
}
}
rememberCounter は model/Counter.kt など別ファイルに記載する
data class Counter(
val count: Int,
val increment: () -> Unit
)
@Composable
fun rememberCounter(): Counter {
var count by rememberSaveable { mutableStateOf(0) }
return remember(count) {
Counter(
count = count, // 状態
increment = { count++ } // ロジック
)
}
}