【问题标题】:How to save and restore navigation state in Jetpack Compose?如何在 Jetpack Compose 中保存和恢复导航状态?
【发布时间】:2022-11-07 00:56:47
【问题描述】:

我想导航到另一个屏幕,但我想保存当前状态,然后恢复它。我尝试按照bottom navigation documentation 中的描述进行操作:

navController.navigate(Screen.CameraScreen.route) {
        popUpTo(navController.graph.id) {
            saveState = true
        }
    restoreState = true
}

但它不起作用。

【问题讨论】:

    标签: android android-jetpack-compose android-jetpack-navigation


    【解决方案1】:

    尝试这个:

    navController.navigate(Screen.CameraScreen.route) {
            navController.graph.startDestinationRoute?.let { route ->
                popUpTo(route) {
                    saveState = true
                }
            }
            launchSingleTop = true
            restoreState = true
        }
    

    【讨论】:

    • 不,不在文本字段中保存文本。它也回到第一个屏幕。
    【解决方案2】:

    我认为你应该使用rememberSaveable


    Restoring state in Compose

    在重新创建活动或流程后,使用 rememberSaveable 恢复您的 UI 状态。 rememberSaveable 跨重组保留状态。此外,rememberSaveable 还保留跨活动和进程重新创建的状态。

    Ways to store state

    添加到 Bundle 的所有数据类型都会自动保存。如果您想保存无法添加到 Bundle 的内容,有多种选择。

    Parcelize

    最简单的解决方案是在对象中添加@Parcelize 注解。对象变得可包裹,并且可以捆绑。例如,此代码创建一个可包裹的 City 数据类型并将其保存到 state。


    像这样 :

    @Parcelize
    data class City(val name: String, val country: String) : Parcelable
    
    @Composable
    fun CityScreen() {
        var selectedCity = rememberSaveable {
            mutableStateOf(City("Madrid", "Spain"))
        }
    }
    

    此外,您可以像这样使用MapSaver:

    data class City(val name: String, val country: String)
    
    val CitySaver = run {
        val nameKey = "Name"
        val countryKey = "Country"
        mapSaver(
            save = { mapOf(nameKey to it.name, countryKey to it.country) },
            restore = { City(it[nameKey] as String, it[countryKey] as String) }
        )
    }
    
    @Composable
    fun CityScreen() {
        var selectedCity = rememberSaveable(stateSaver = CitySaver) {
            mutableStateOf(City("Madrid", "Spain"))
        }
    }
    

    还有,ListSaver:

    data class City(val name: String, val country: String)
    
    val CitySaver = listSaver<City, Any>(
        save = { listOf(it.name, it.country) },
        restore = { City(it[0] as String, it[1] as String) }
    )
    
    @Composable
    fun CityScreen() {
        var selectedCity = rememberSaveable(stateSaver = CitySaver) {
            mutableStateOf(City("Madrid", "Spain"))
        }
    }
    

    可能,根据我提供的信息,您不需要参考参考来源。试试编码吧!

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多