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

如何让Firebase显示字符串而非DocumentReference对象?

问题分析与解决方法

核心问题

你看到的com.google.firebase.firestore.DocumentReference@26621628是DocumentReference对象的默认toString结果,说明你没有正确获取并展示Firestore文档中的字符串数据,反而意外输出了文档引用对象本身。

具体错误点与修复步骤

1. 屏幕中错误调用无返回值函数并toString

你的getQuest()是无返回值(Unit类型)函数,直接调用viewModel.getQuest().toString()逻辑错误;同时ViewModel没有暴露可观察的问题数据状态,导致无法正确展示内容。

修复ViewModel代码:

// ViewModel中添加可观察的问题状态
private val _quest = mutableStateOf<Quest?>(null)
val quest: State<Quest?> = _quest

fun getQuest() {
    reset()
    viewModelScope.launch {
        try {
            // 从Repository获取数据并更新状态
            val fetchedQuest = questRepository.getQuest()
            _quest.value = fetchedQuest
        } catch (ex: QuestRepository.QuestRetrievalError) {
            val errorMsg = "获取问题时出错.\n" +
                    "请确认已安装Firestore的google-services.json文件."
            Log.e(TAG, ex.message ?: errorMsg)
            _errorText.value = errorMsg
        }
    }
}

修复Repository的getQuest函数:

当前Repository仅更新内部状态,未将数据返回给ViewModel,调整为:

suspend fun getQuest(): Quest {
    return try {
        withTimeout(5_000) {
            val data = questDocument.get().await()
            
            // 先判断文档是否存在,避免空指针
            if (!data.exists()) {
                throw QuestRetrievalError("指定文档不存在")
            }

            val question = data.getString("Question") ?: ""
            val answer = data.getString("answer") ?: ""

            Quest(question, answer).also {
                _quest.value = it
            }
        }
    } catch (e: Exception) {
        throw QuestRetrievalError("获取Firestore数据失败: ${e.message}")
    }
}

修复Question1Screen中的展示逻辑:

fun Question1Screen (navController: NavController, viewModel: QuestViewModel) {
    var selectedAnswer by remember { mutableStateOf(-1) }
    val quest by viewModel.quest.collectAsState()

    // 页面初始化时调用数据获取逻辑,避免重复触发
    LaunchedEffect(Unit) {
        viewModel.getQuest()
    }

    Column(Modifier.padding(16.dp)) {
        Box(
            modifier = Modifier.fillMaxWidth(),
            contentAlignment = Alignment.TopEnd
        ) {
            // 展示问题内容,处理加载/空状态
            Text(text = quest?.question ?: "加载中...")
        }
    }
}

2. 检查Firestore文档引用的层级是否正确

你在Screen中写的集合名D3NhDOEPBdaW8bEUPfjL看起来更像自动生成的文档ID,大概率是搞反了集合与文档的层级。确保Repository中的questDocument初始化正确:

// Repository中的初始化示例
private val firestore = FirebaseFirestore.getInstance()
// 正确结构:集合名 -> 文档ID
val questDocument = firestore.collection("questions").document("D3NhDOEPBdaW8bEUPfjL")
// 如果你的结构确实是集合为"D3NhDOEPBdaW8bEUPfjL"、文档为"Question",则保持原写法

3. 移除Screen中冗余的Firestore调用

Screen中直接写的Firestore获取逻辑与ViewModel/Repository的逻辑重复,会导致代码混乱,直接删除这部分代码即可。

总结

  1. 让ViewModel暴露可观察的quest状态,在Compose中通过collectAsState监听
  2. 修正Repository的getQuest函数,确保数据能传递到ViewModel
  3. 检查Firestore的集合/文档层级,避免搞反ID
  4. 移除Screen中重复的Firestore逻辑,统一通过ViewModel获取数据

内容的提问来源于stack exchange,提问作者Tig709

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:57:02