在我看到的视图模型与 Jetpack Compose 结合使用的所有示例中,通常将视图模型中的状态存储为 MutableStateFlow,然后在 compose 函数中应用collectAsState 以获得 Compose 状态。
我的问题:为什么不直接将状态存储在视图模型中,而不是一些流程?例如
class MyViewModel: ViewModel() {
val showDialog = mutableStateOf(false)
}
@Compose
fun MyScreen(viewModel: MyViewModel) {
Button(onClick = { viewModel.showDialog = true })
if (viewModel.showDialog) {
AlertDialog(...)
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎按预期运行。那么这是一个有效的解决方案吗?
我在 Jetpack Compose 与导航结合使用时遇到了奇怪的行为:如果您在某些导航可组合项中使用 RememberSaveable,则状态不会按承诺保存(例如,旋转后会丢失)。这是一个简单的例子:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material.MaterialTheme
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
MyScreen()
}
}
}
}
@Composable
fun MyScreen() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "xyz") {
composable("xyz") {
var value by rememberSaveable { mutableStateOf("") }
TextField(value = value, onValueChange = …Run Code Online (Sandbox Code Playgroud) android-architecture-navigation android-jetpack-compose jetpack-compose-navigation