アンドロイドJetpack
11414 ワード
モデル- View - ViewModel(MVVM)は、ビューが特定のモデルプラットフォームに依存しないように、ビジネスロジックまたはバックエンドロジック(モデル)の開発からGUIのビューの分離を容易にするソフトウェアアーキテクチャパターンです.MVVMのViewModelは、オブジェクトが簡単に管理されて、提示されるような方法でモデルからデータオブジェクトを公開するのに責任があります.この点において、ViewModelはビューより多くのモデルである.そして、ビューの表示論理の全てでない場合、大部分を扱う.ViewModelは、Mediatorパターンを実装し、ビューによってサポートされているユースケースのセットの周りのバックエンドロジックへのアクセスを整理することができます.
私は、これらの3つの層を示している小さなサンプルと一緒にJetpack Composeで互いに関連するサンプルを入れました.プロパティ/メソッド名以外には、オブジェクトのどれも他のものについて何も知りません.各層は完全に他の独立して構築することができます.
サンプルモデル
サンプルビューモデル
これは、ビューと対話するために必要なものをすべて含むべきです.たった今、それは2人のメンバーを含みます:ユーザーとaddUser機能.ビューモデルでユーザーのコレクションの状態を維持するために、mutablestatelistOfを使用していることに注意してください.
サンプルビュー
そして今、ビュー.これらはデータの表示方法を定義するDataTemplateです.ViewModelは構成変更を生き抜くので、あなたはあなたの構成コードをホストする活動または断片ライフサイクルに対処することなく、UIに関連した状態とイベントをカプセル化することができます.
私は、これらの3つの層を示している小さなサンプルと一緒にJetpack Composeで互いに関連するサンプルを入れました.プロパティ/メソッド名以外には、オブジェクトのどれも他のものについて何も知りません.各層は完全に他の独立して構築することができます.
サンプルモデル
import java.util.*
data class User(
var id: UUID,
var name: String
)
サンプルビューモデル
これは、ビューと対話するために必要なものをすべて含むべきです.たった今、それは2人のメンバーを含みます:ユーザーとaddUser機能.ビューモデルでユーザーのコレクションの状態を維持するために、mutablestatelistOfを使用していることに注意してください.
import androidx.compose.runtime.*
import androidx.lifecycle.ViewModel
class UserViewModel : ViewModel() {
private val _users = mutableStateListOf<User>()
val users: List<User>
get() = _users
fun addUser(user: User) {
_users.add(user)
}
}
サンプルビュー
そして今、ビュー.これらはデータの表示方法を定義するDataTemplateです.ViewModelは構成変更を生き抜くので、あなたはあなたの構成コードをホストする活動または断片ライフサイクルに対処することなく、UIに関連した状態とイベントをカプセル化することができます.
@Composable
fun UserView() {
val vm by remember { mutableStateOf(UserViewModel()) }
Scaffold(
topBar = {
TopAppBar(
title = { Text("Users") },
actions = {
IconButton(onClick = {
vm.addUser(User(UUID.randomUUID(), "User"))
}) {
Icon(Icons.Filled.Add, null)
}
})
},
content = {
Column(modifier = Modifier.padding(16.dp)) {
LazyColumn(modifier = Modifier.fillMaxHeight()) {
items(vm.users) {
Column {
Text(it.name)
Text("${it.id}")
}
}
}
}
}
)
}
さらに、次のようにグローバルな状態を維持するために、UIモデルツリーをさらにアップグレードすることができます.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm = UserViewModel()
setContent {
MaterialTheme {
UserView(vm)
}
}
}
}
@Composable
fun UserView(vm: UserViewModel) {
Scaffold(
topBar = {
TopAppBar(
title = { Text("Users") },
actions = {
IconButton(onClick = {
vm.addUser(User(UUID.randomUUID(), "User"))
}) {
Icon(Icons.Filled.Add, null)
}
})
},
content = {
Column(modifier = Modifier.padding(16.dp)) {
LazyColumn(modifier = Modifier.fillMaxHeight()) {
items(vm.users) {
Column {
Text(it.name)
Text("${it.id}")
}
}
}
}
}
)
}
Reference
この問題について(アンドロイドJetpack), 我々は、より多くの情報をここで見つけました https://dev.to/paulallies/android-jetpack-compose-mvvm-1b92テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol