在我的 Jetpack Compose 项目中,我总是使用 ViewModel,并且有由不同状态组成的 StateFlow 数据类。例如 isLoading、productsList、shouldShowDialog 等
我的问题是,有不同的状态处理程序,例如 returnedStateOf。如果我在 viewModel 中管理状态,是否需要使用状态处理程序,或者它是为在可组合项中声明的值保留的?如果是,那么如果状态由 viewModel 处理,为什么我还需要凝视处理程序?
当然,您可以自由地在 Android ViewModel 中使用各种状态持有者。就我个人而言,我倾向于使用
Flows
来处理数据流,并依靠 StateFlows
来处理状态,以及 Channels
来管理事件。
您还可以使用从
mutableState
或 derivedStateOf
获取的状态。这些为您提供快照状态State<T>
,并且每当值发生变化时都会收到通知。
这是一个示例,我使用 ViewModel 中的状态变量并从 UI 更新它们,同时我们有一个不同的状态属性,该属性依赖于 TextField 并实时更新。
// MainActivity.kt
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val viewModel = ViewModelProvider(this)[MainViewModel::class.java]
super.onCreate(savedInstanceState)
setContent {
ComposeSamplesTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Column {
TextField(value = viewModel.name, onValueChange = { viewModel.name = it })
Text(text = viewModel.age)
}
}
}
}
}
}
// MainViewModel.kt
class MainViewModel : ViewModel() {
var name by mutableStateOf("John Doe")
val age by derivedStateOf {
"$name is 25 years old!"
}
}