Jetpack Compose中选择正确答案却返回false的问题排查
问题分析与解决:Jetpack Compose随机字符问答判断错误
核心问题
你点击Next按钮时的逻辑顺序完全搞反了:
你先重新生成了新的answers列表和新的randomElement(新问题),然后才去对比answers[selectedIndex]和randomElement——这时候的answers已经是全新的列表,和用户刚才选中的那个旧列表根本不是同一个,自然会出现“选对了却返回false”的情况。
解决步骤
- 先判断对错,再更新数据:在点击Next时,先拿当前的
question和当前answers里用户选中的内容对比,完成判断后再生成新的问题和答案。 - 优化状态管理:把全局的状态变量移到
MyUi内部用remember管理,避免全局状态带来的混乱。 - 严谨生成选项:确保错误选项和正确选项不重复,避免出现多个相同选项的情况。
修改后的完整代码
val characters = mutableListOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") @Composable fun MyUi() { var answers by remember { mutableStateOf(emptyList<String>()) } var question by remember { mutableStateOf("") } var selectedIndex by remember { mutableIntStateOf(-1) } // 初始化首次加载的题目数据 LaunchedEffect(Unit) { generateNewQuestion { newQ, newA -> question = newQ answers = newA } } Column { Text( text = "Select: $question", fontSize = 36.sp, modifier = Modifier.padding(16.dp) ) LazyColumn(content = { items(answers.size) { index -> Button( onClick = { selectedIndex = index }, colors = ButtonDefaults.buttonColors( containerColor = if (selectedIndex == index) { Color.LightGray } else { Color.White } ), modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 4.dp) ) { Text(text = answers[index]) } } }) Button( onClick = { // 第一步:先判断当前选中的答案是否正确 if (selectedIndex in 0..3) { val selectedAnswer = answers[selectedIndex] if (selectedAnswer == question) { Log.d("myTag", "correct") Log.d("myTag", "选中:$selectedAnswer,正确:$question") } else { Log.d("myTag", "false") Log.d("myTag", "选中:$selectedAnswer,正确:$question") } } // 第二步:生成新的题目和选项 generateNewQuestion { newQ, newA -> question = newQ answers = newA } selectedIndex = -1 }, modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Text(text = "Next") } } } // 抽出生成题目的逻辑,复用更方便 private fun generateNewQuestion(callback: (String, List<String>) -> Unit) { val correctChar = characters.random() val wrongChars = mutableListOf<String>() // 生成3个不重复且不等于正确答案的错误选项 while (wrongChars.size < 3) { val char = characters.random() if (char != correctChar && char !in wrongChars) { wrongChars.add(char) } } val answerList = mutableListOf(correctChar) + wrongChars answerList.shuffle() // 打乱选项顺序 callback(correctChar, answerList) }
关键修改说明
- Next按钮点击时优先完成对错判断,再更新题目数据,确保判断用的是用户选择时的原数据。
- 用
LaunchedEffect初始化首次数据,避免全局变量的初始化时机问题。 - 单独抽出生成题目的函数,让代码逻辑更清晰,也方便后续扩展。
内容的提问来源于stack exchange,提问作者Jorpy
相关产品推荐
相关产品推荐

