Android Jetpack Compose by rememberSaveable State 不支持后退按钮
Android Jetpack Compose by rememberSaveable State does not survive Back Button
我找不到 Restore UI state after activity or process recreation section of the State and Jetpack Compose 代码示例中显示的 savedInstanceState
函数,该部分说 “在 activity 和进程重新创建期间保留状态。”。 =26=]
我确实找到了 androidx.compose.runtime.saveable
documentation,其中包含 rememberSaveable
,这似乎是 savedInstanceState
的重命名或替换,其文档还说 “...存储的值将在 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 终止您在后台运行的进程
- 通过某种方式将 returns 用于您的应用程序
届时,Android 将为您分叉一个新进程,并尝试将您的 UI 恢复到用户离开您的应用程序之前的状态。保存的实例状态是该恢复的一部分。
我找不到 Restore UI state after activity or process recreation section of the State and Jetpack Compose 代码示例中显示的 savedInstanceState
函数,该部分说 “在 activity 和进程重新创建期间保留状态。”。 =26=]
我确实找到了 androidx.compose.runtime.saveable
documentation,其中包含 rememberSaveable
,这似乎是 savedInstanceState
的重命名或替换,其文档还说 “...存储的值将在 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 终止您在后台运行的进程
- 通过某种方式将 returns 用于您的应用程序
届时,Android 将为您分叉一个新进程,并尝试将您的 UI 恢复到用户离开您的应用程序之前的状态。保存的实例状态是该恢复的一部分。