通过 rememberSaveable State 编写的 Android Jetpack Compose 无法在后退按钮中存活

标签 android android-jetpack android-jetpack-compose

我找不到 savedInstanceState Restore UI state after activity or process recreation 中的代码示例中显示的函数State and Jetpack Compose 的部分该部分说“在 Activity 和过程重新创建中保留状态”。
我确实找到了 androidx.compose.runtime.saveable documentation其中包含 rememberSaveable这似乎是 savedInstanceState 的重命名或替换并且它的文档还说“......存储的值(value)将在 Activity 或流程再造中幸存下来。”
但是,当我在我的代码中使用它时,状态不会在后退按钮中保留下来,尽管它会在旋转中保留下来。这与文档所说的相反。

package com.example.jetwatch

import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.*
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue

class MainActivity : AppCompatActivity() {
 override fun onCreate(bundle: Bundle?) {
  super.onCreate(bundle)
  setContent {
   MaterialTheme(colors = if (isSystemInDarkTheme()) darkColors() else lightColors()) {
    Surface {
     Column {
      Row {
       Column {
        var m by rememberSaveable { mutableStateOf(0) }
        Text("m = $m")
        Button(onClick = { ++m }) {
         Text("bump")
        }
       }
      }
     }
    }
   }
  }
 }
}

最佳答案

the state does not survive the back button


在该示例中,这是预期的行为。后退导航的默认行为是销毁 Activity 。保存的实例状态此时被丢弃。这不是 Compose 独有的,并且自 Android 1.0 以来一直是 Android 的常规行为。

That's contrary to what the documentation says.


文档中使用的“流程终止”是指此流程:
  • 用户在您的应用中
  • 用户切换到启动器(通过主页导航)或另一个应用程序(例如,通过概览屏幕)
  • 在接下来的几分钟内(但少于 30 分钟),Android 会在后台终止您的进程
  • 通过一种或另一种方式使用返回到您的应用程序

  • 届时,Android 将为您创建一个全新的流程,并尝试将您的 UI 恢复到用户离开您的应用程序之前的状态。保存的实例状态是该恢复的一部分。

    关于通过 rememberSaveable State 编写的 Android Jetpack Compose 无法在后退按钮中存活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66424642/

    相关文章:

    android - 更改 Composable 的布局方向

    android - 如果一个文本行很长,如何使盒子中的弹性 flutter 以使每一行居中?

    android - Android EditText 中的 Highlite 特定单词

    android - 为什么在运行我的项目时会出现此 google guava 错误?

    android - fragment 生命周期在导航上重叠

    android - 如何在 jetpack compose 中检测拖动手势谷歌地图?

    android - Jetpack 组合和 fragment

    sqlite - Android 中存在数据库问题的应用程序类

    android - 如何使用为 Android 12 发布的新 Material You 颜色

    android - Google 为新的 Android 应用架构推荐的文件结构