Jetpack Compose 使用 ViewModel 进行状态处理

问题描述 投票:0回答:1

在我的 Jetpack Compose 项目中,我总是使用 ViewModel,并且有由不同状态组成的 StateFlow 数据类。例如 isLoading、productsList、shouldShowDialog 等

我的问题是,有不同的状态处理程序,例如 returnedStateOf。如果我在 viewModel 中管理状态,是否需要使用状态处理程序,或者它是为在可组合项中声明的值保留的?如果是,那么如果状态由 viewModel 处理,为什么我还需要凝视处理程序?

android android-jetpack-compose android-jetpack
1个回答
0
投票

当然,您可以自由地在 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!"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.