View Model
參考以下網址 https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=zh-cn
將lifecycle的包打入

var lifecycle_version = "2.5.1"
// Lifecycles only (without ViewModel or LiveData)
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version")
// ViewModel utilities for Compose
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version")
建立viewmodel的package,在java目錄下按滑鼠右鍵”New”→”package”

在viewmodel的目錄下建立xxViewModel.kt。


使用mutableState建立ViewModel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package viewmodel
import androidx.compose.runtime.mutableStateListOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class MyViewModel : ViewModel(){
private val _items = mutableStateListOf<String>()
val items: List<String> = _items
init {
loadItems()
}
private fun loadItems() {
viewModelScope.launch {
_items.addAll(List(500) { "Item $it" })
}
}
}
在Compose建立viewModel跟Activity建立viewModel是不同,Compose使用=指派的方式,Android使用by的方式。
Compose ViewModel語法:
@Composable
fun lazyColumnExample7() {
val viewModel: MyViewModel = viewModel()
}
Android ViewModel語法:
class MainActivity08 : AppCompatActivity() {
private val viewModel by viewModels<NumberViewModel>()
}
1
2
3
4
5
6
7
8
9
@Composable
fun lazyColumnExample7() {
val viewModel : MyViewModel = viewModel()
LazyColumn{
items(viewModel.items) { item ->
Text("$item")
}
}
}
使用MutableStateFlow建立ViewModel
ViewModel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
class MyViewModel2 : ViewModel(){
private val _items = MutableStateFlow<List<String>>(emptyList())
val items: StateFlow<List<String>> = _items
init {
loadItems()
}
private fun loadItems() {
viewModelScope.launch {
_items.value = List(500) { "Item $it" }
}
}
}
Compose
1
2
3
4
5
6
7
8
9
10
@Composable
fun lazyColumnExample8() {
val viewModel: MyViewModel2 = viewModel()
val items by viewModel.items.collectAsState()
LazyColumn {
items(items) { item ->
Text("$item")
}
}
}
以下是舊文章
dataClass



建view


