You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中选择正确答案却返回false的问题排查

问题分析与解决:Jetpack Compose随机字符问答判断错误

核心问题

你点击Next按钮时的逻辑顺序完全搞反了:
你先重新生成了新的answers列表和新的randomElement(新问题),然后才去对比answers[selectedIndex]和randomElement——这时候的answers已经是全新的列表,和用户刚才选中的那个旧列表根本不是同一个,自然会出现“选对了却返回false”的情况。

解决步骤

  1. 先判断对错,再更新数据:在点击Next时,先拿当前的question和当前answers里用户选中的内容对比,完成判断后再生成新的问题和答案。
  2. 优化状态管理:把全局的状态变量移到MyUi内部用remember管理,避免全局状态带来的混乱。
  3. 严谨生成选项:确保错误选项和正确选项不重复,避免出现多个相同选项的情况。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:52:40