下面我有一个简单的完整的可组合代码(您可以逐字放入MainActivity.kt并运行它)
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")
}
}当我运行它时,它只会自动增加数字。如果我将其放在后台(并使用“不要保持活动”设置来终止进程),并将其放回前台,它将尝试恢复状态。在那个时候,它将与
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,生产线上抱怨浇铸错误
Checkbox(
checked = checkedState,
onCheckedChange = {
myText = if (it) "Internal Change" else "Internal Change Again"
checkedState = it
}
)要解决这个问题,我只需要交换
var myText by rememberSaveable(textValue) { mutableStateOf(textValue) }
var checkedState by rememberSaveable { mutableStateOf(false) }至
var checkedState by rememberSaveable { mutableStateOf(false) }
var myText by rememberSaveable(textValue) { mutableStateOf(textValue) }看起来rememberSaveable值恢复是不正确的,并且受到代码顺序的影响(这是奇怪的)。感觉就像Google中的一个bug编写代码,但是请在这里询问,以防我错过任何明显的东西
发布于 2022-10-04 11:49:40
看起来问题是因为我使用的是撰写版本1.1.1。它已在撰写版本1.2.0中得到修正。
https://stackoverflow.com/questions/73947154
复制相似问题