Функция viewModel
Функция viewModel из пакета
lifecycle-viewmodel-compose достаёт
ViewModel,
привязанную к текущему
LifecycleOwner
или NavBackStackEntry.
Пока owner жив, возвращается тот же
экземпляр. В параметрах можно указать
фабрику и ключ.
Синтаксис
val model: MyViewModel = viewModel()
Параметры
| Параметр | Описание |
|---|---|
viewModelStoreOwner |
Владелец хранилища моделей. По умолчанию берут LocalViewModelStoreOwner. |
key |
Строковый ключ, если нужно несколько ViewModel одного типа на одном экране. |
factory |
Фабрика создания ViewModel с зависимостями, например SavedStateHandle. |
Пример
Давайте получим ViewModel в setContent:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
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: HelloViewModel = viewModel()
val text by model.text.collectAsState()
Text(text = text)
}
}
}
class HelloViewModel : ViewModel() {
private val _text = MutableStateFlow("abcde")
val text = _text.asStateFlow()
}
На экране будет текст "abcde"
из модели, общей для всего setContent.
Пример
Давайте обновим модель и увидим перерисовку:
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: HelloViewModel = viewModel()
val text by model.text.collectAsState()
Button(onClick = { model.setOther() }) {
Text(text = "abcde")
}
Text(text = text)
}
}
}
class HelloViewModel : ViewModel() {
private val _text = MutableStateFlow("abcde")
val text = _text.asStateFlow()
fun setOther() {
_text.value = "12345"
}
}
На экране по нажатию текст сменится
на "12345" без remember в composable.
Смотрите также
-
класс
ViewModel,
который возвращает эта функция -
класс
SavedStateHandle,
который передают через factory -
функция
collectAsState,
которой показывают данные модели -
класс
LifecycleOwner,
к которому привязан viewModelStore