首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RememberSaveable还原值类型受代码顺序的影响?

RememberSaveable还原值类型受代码顺序的影响?
EN

Stack Overflow用户
提问于 2022-10-04 11:24:03
回答 1查看 61关注 0票数 1

下面我有一个简单的完整的可组合代码(您可以逐字放入MainActivity.kt并运行它)

代码语言:javascript
复制
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            var number by rememberSaveable { mutableStateOf(0) }
            MyComposableFun("$number")

            LaunchedEffect(Unit) {
                while(true) {
                    delay(500)
                    number++
                }
            }
        }
    }
}

@Composable
fun MyComposableFun(textValue: String) {

    var myText by rememberSaveable(textValue) { mutableStateOf(textValue) }
    var checkedState by rememberSaveable { mutableStateOf(false) }

    Row (verticalAlignment = Alignment.CenterVertically) {
        Checkbox(
            checked = checkedState,
            onCheckedChange = {
                myText = if (it) "Internal Change" else "Internal Change Again"
                checkedState = it
            }
        )
        Text("Title: $myText")
    }
}

当我运行它时,它只会自动增加数字。如果我将其放在后台(并使用“不要保持活动”设置来终止进程),并将其放回前台,它将尝试恢复状态。在那个时候,它将与

代码语言:javascript
复制
    java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
        at com.example.learnabstractcomposeview.MainActivityKt.MyComposableFun$lambda-3(MainActivity.kt:109)
        at com.example.learnabstractcomposeview.MainActivityKt.MyComposableFun(MainActivity.kt:42)
        at com.example.learnabstractcomposeview.ComposableSingletons$MainActivityKt$lambda-1$1.invoke(MainActivity.kt:22)
        at com.example.learnabstractcomposeview.ComposableSingletons$MainActivityKt$lambda-1$1.invoke(MainActivity.kt:20)

checked = checkedState,生产线上抱怨浇铸错误

代码语言:javascript
复制
        Checkbox(
            checked = checkedState,
            onCheckedChange = {
                myText = if (it) "Internal Change" else "Internal Change Again"
                checkedState = it
            }
        )

要解决这个问题,我只需要交换

代码语言:javascript
复制
    var myText by rememberSaveable(textValue) { mutableStateOf(textValue) }
    var checkedState by rememberSaveable { mutableStateOf(false) }

代码语言:javascript
复制
    var checkedState by rememberSaveable { mutableStateOf(false) }
    var myText by rememberSaveable(textValue) { mutableStateOf(textValue) }

看起来rememberSaveable值恢复是不正确的,并且受到代码顺序的影响(这是奇怪的)。感觉就像Google中的一个bug编写代码,但是请在这里询问,以防我错过任何明显的东西

EN

回答 1

Stack Overflow用户

发布于 2022-10-04 11:49:40

看起来问题是因为我使用的是撰写版本1.1.1。它已在撰写版本1.2.0中得到修正。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73947154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档