我正试图从Firestore获取数据.下面的代码主要来自文档,虽然编写数据没有问题,但从数据库中并没有得到任何信息.

来自片段的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    init()
}

private fun init() {
    db = FirebaseFirestore.getInstance()
    mFirestoreRef = db.collection("users").document(USER_ID).collection("deals")
    val viewModel = ViewModelProvider(this).get(DealsViewModel::class.java)
    viewModel.retriveData(mFirestoreRef)
    recyclerView = binding.rcView
    adapter = TradeNoteAdapter()
    recyclerView.adapter = adapter
    var notes = viewModel.getAllNotes()
    adapter.setList(notes)
}

ViewModel中的代码:

import android.widget.Toast
import androidx.lifecycle.ViewModel
import com.google.firebase.firestore.CollectionReference
import space.timur.tradenotefirebase.APP
import space.timur.tradenotefirebase.model.TradeNoteModel

class DealsViewModel : ViewModel() {

private var notes: ArrayList<TradeNoteModel> = ArrayList()

fun retriveData(firestoreReference: CollectionReference){
    firestoreReference.get()
        .addOnSuccessListener { documents ->
            for(document in documents){
                var note = document.toObject(TradeNoteModel::class.java)
                notes.add(note)
            }
        }.addOnFailureListener{ e->
            Toast.makeText(APP, e.message, Toast.LENGTH_SHORT).show()
        }
}

fun getAllNotes(): ArrayList<TradeNoteModel> {
    return notes
}

}

推荐答案

你不应该这样对待Firestore.所有Firebase API都是异步的,因此无法简单地返回notes作为方法的结果.为了解决这个问题,您可以使用自定义回调,如本answer中所述,或者由于您使用的是Kotlin,您也可以考虑使用Kotlin Coroutines,如本answer中所述.

除此之外,我强烈建议您阅读本文:

在这里,我已经解释了四种处理Firestore的方法.

Android相关问答推荐

带有kSP而不是kapt的Hilt

如何在点击按钮时将字符串插入到文本字段中的光标位置?

道查询注释部分房间表名称

如何使用视图模型触发可变状态?

使用Retrofit2的API调用:我如何能够一直进行API调用,以更新数据而无需重新打开应用程序

我到底应该如何分享我的应用程序中的图片?

无法将项目添加到文件室数据库

不能在LazyGrid-Jetpack Compose中使用填充最大宽度或填充父项最大宽度

如何在Android Studio的LinearLayout中禁用阴影

为什么我有多个Player实例?

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

如何使用 Wea​​r OS 上的运行状况服务模拟位置?

无法插入 LayoutNode@cc72396 子级,因为它已有父级

Android Studio Relay插件(版本0.3.07)错误

减少Compose中可滚动选项卡之间的间距

如何在ExecutorService中设置progressBar的进度?不想使用 AsyncTask,因为它已被弃用

只能从同一个库组内调用成功(引用groupId=androidx.work from groupId=My Composable)

用作输入参数的 Lambda 函数导致重组

了解 Compose 声明性逻辑

如何在 Jetpack Compose 中禁用 TabRow 或 Tab 中的涟漪效应?