View Model

參考以下網址 https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=zh-cn

將lifecycle的包打入
img

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”
img

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

img

使用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 img
img
img
建view img
img
img

results matching ""

    No results matching ""