提问人:Cuyer 提问时间:11/9/2023 更新时间:11/9/2023 访问量:57
使用 ViewModel 处理 Jetpack Compose 状态
Jetpack Compose state handling with ViewModel
问:
在我的 Jetpack Compose 项目中,我总是使用 ViewModels,在那里我有由不同状态组成的 StateFlow 数据类。例如,isLoading、productsList、shouldShowDialog 等。
我的问题是,有不同的状态处理程序,例如 derivedStateOf。如果我在 viewModel 中管理状态,我是否需要使用状态处理程序,或者为在可组合项中声明的值保留状态处理程序?如果是,那么如果 viewModel 正在处理状态,为什么我还需要凝视处理程序?
答:
1赞
Rafsanjani
11/9/2023
#1
当然,您可以自由地在 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!"
}
}
评论