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

Luc*_*ann 5 android-architecture-navigation android-jetpack-compose jetpack-compose-navigation

我在 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 = { value = it })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码生成一个可以在其中键入的文本字段。一旦旋转屏幕,输入的文本就会丢失,即使该值应该由 RememberSaveable 保存。

经过一番调查,我注意到以下几点:

  • 问题确实出在 NavHost 上。如果将定义变量“value”的行移动到“MyScreen()”的顶部(NavHost 之外),那么一切都会按预期工作。

  • 真正的问题似乎是可组合变量“currentCompositeKeyHash”在 NavHost 内的配置更改后不会保留。该变量用作savedInstanceBundle的键,以通过rememberSaveable检索保存的值,从而状态丢失。特别是,如果在 RememberSaveable 中显式指定一个键,那么一切都会按预期工作。

这是一个错误还是我误解了什么?

Fel*_*ütz 1

更新:

版本2.4.0-alpha07已发布并修复了问题:

implementation "androidx.navigation:navigation-compose:2.4.0-alpha07"
Run Code Online (Sandbox Code Playgroud)

原答案:

2.4.0-alpha05这是版本和2.4.0-alpha06的已知问题androidx.navigation:navigation-compose。当前的解决方案是降级为2.4.0-alpha04

implementation "androidx.navigation:navigation-compose:2.4.0-alpha04"
Run Code Online (Sandbox Code Playgroud)

根据问题跟踪器,该问题已在版本中修复2.4.0-alpha07,希望很快就会发布。