小编Luc*_*ann的帖子

视图模型中的 MutableState?

在我看到的视图模型与 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)

上面的代码似乎按预期运行。那么这是一个有效的解决方案吗?

android-jetpack-compose

21
推荐指数
2
解决办法
2万
查看次数

Jetpack Compose + 导航:rememberSaveable 在旋转时丢失状态

我在 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

5
推荐指数
1
解决办法
4598
查看次数