Класс ViewModel
Класс ViewModel держит состояние
и логику, которым не нужна каждая
перерисовка Compose.
Объект живёт, пока живёт scope
активности или NavBackStackEntry.
В Compose его получают функцией
viewModel.
Перед уничтожением ViewModel система
вызывает метод
onCleared.
Синтаксис
class ScreenViewModel : ViewModel() {
}
Методы
| Метод | Описание |
|---|---|
onCleared |
Вызывается перед удалением ViewModel. Здесь отменяют Job и закрывают ресурсы. |
Пример
Давайте выведем текст из ViewModel через Flow:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val model: LabelViewModel = viewModel()
val text by model.text.collectAsState()
Button(onClick = { model.flip() }) {
Text(text = "abcde")
}
Text(text = text)
}
}
}
class LabelViewModel : ViewModel() {
private val _text = MutableStateFlow("abcde")
val text = _text.asStateFlow()
fun flip() {
_text.value = if (_text.value == "abcde") {
"12345"
} else {
"abcde"
}
}
}
На экране текст меняется по кнопке и сохранится при повороте экрана.
Смотрите также
-
функция
viewModel,
которая достаёт ViewModel в Compose -
класс
SavedStateHandle,
который передают во ViewModel для Bundle -
метод
onCleared,
где освобождают ресурсы модели -
функция
collectAsState,
которой читают StateFlow на экране