使用 ViewModel 处理 Jetpack Compose 状态

Jetpack Compose state handling with ViewModel

提问人:Cuyer 提问时间:11/9/2023 更新时间:11/9/2023 访问量:57

问:

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

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

人造人 android-jetpack-compose 安卓喷气背包

评论


答:

1赞 Rafsanjani 11/9/2023 #1

当然,您可以自由地在 Android ViewModel 中使用各种状态持有者。就我个人而言,我倾向于使用数据流,并依赖于状态和管理事件。FlowsStateFlowsChannels

也可以使用从任一 或 .它们为您提供快照状态,并在值更改时收到通知。mutableStatederivedStateOfState<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!"
    }
}