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

Firebase中addListenerForSingleValueEvent查询未执行问题求助

问题修复方案

核心问题分析

你的代码出现空白弹窗的原因是:Firebase的addListenerForSingleValueEvent是异步执行的——你在监听器回调(onDataChange/onCancelled)触发前就调用了builder.show(),此时弹窗已经创建并显示,后续在回调里设置的setMessage根本不会更新已显示的弹窗。此外代码还有两处逻辑错误:

  • 匹配到推荐码后,错误地从整个Users节点(snapshot)取name,应该从当前匹配的用户节点(postSnapshot)获取
  • 遍历所有用户节点验证推荐码效率极低,应该用Firebase查询直接定位目标用户

修复后的完整代码

var barcodeLauncher = registerForActivityResult(
    ScanContract()
) { result: ScanIntentResult ->
    if (result.contents != null) {
        val referralCode = result.contents
        val userRef = FirebaseDatabase.getInstance().getReference("Users")

        // 用查询直接定位含目标推荐码的用户,避免全量遍历
        userRef.orderByChild("referralCode").equalTo(referralCode)
            .addListenerForSingleValueEvent(object : ValueEventListener {
                override fun onDataChange(snapshot: DataSnapshot) {
                    val dialogBuilder = AlertDialog.Builder(this@ReferralActivity)
                    dialogBuilder.setTitle("结果")
                    dialogBuilder.setPositiveButton("确定") { dialog, _ -> dialog.dismiss() }

                    if (snapshot.exists()) {
                        // 推荐码唯一,取第一个匹配的用户节点
                        val targetUser = snapshot.children.first()
                        val userName = targetUser.child("name").value.toString()
                        dialogBuilder.setMessage("您已成功关联${userName},请享用您的奖励!")
                    } else {
                        dialogBuilder.setMessage("未找到使用该推荐码的用户...")
                    }

                    // 数据加载完成后再显示弹窗
                    dialogBuilder.show()
                }

                override fun onCancelled(error: DatabaseError) {
                    val errorDialog = AlertDialog.Builder(this@ReferralActivity)
                    errorDialog.setTitle("结果")
                    errorDialog.setMessage("查询出错:${error.message}")
                    errorDialog.setPositiveButton("确定") { dialog, _ -> dialog.dismiss() }
                    errorDialog.show()
                }
            })
    }
}

关键修复点

  1. 异步逻辑调整:将弹窗的创建和显示逻辑移到监听器回调内部,确保拿到数据库返回的数据后再构建弹窗,避免空白显示
  2. 优化查询方式:使用orderByChild("referralCode").equalTo(referralCode)直接筛选目标用户,减少不必要的数据传输和遍历操作
  3. 修正用户名读取逻辑:从匹配的单个用户节点中读取name值,而非整个Users节点
  4. 错误处理增强:在onCancelled中添加具体错误信息,便于排查数据库访问问题

内容的提问来源于stack exchange,提问作者YUNG FOOK YONG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:05:21