【问题标题】:I want to get all my words from Firestore, so I wrote that code but it didn't work. Why? What should I do?我想从 Firestore 中得到我所有的话,所以我写了那个代码,但它没有用。为什么?我应该怎么办?
【发布时间】:2022-11-15 12:41:35
【问题描述】:
@Composable
fun getData() {
        var wordData = arrayListOf<Word>()
        db.get().addOnSuccessListener { documents ->
            for (document in documents) {
                wordData.add(document.toObject(Word::class.java))
            }
        }
        LazyColumn {
            items(wordData) {  word ->
                WordCard(word = word)
            }
        }
    }

`

我想用惰性列来显示我所有的单词数据,这些是我的 WordCard 代码。 `

@Composable
fun WordCard(word: Word) {
    Text(text = word.word, color = Color.Black, modifier = Modifier.background(Color.Gray).padding(12.dp))
}

`

【问题讨论】:

    标签: firebase kotlin google-cloud-platform google-cloud-firestore android-jetpack-compose


    【解决方案1】:

    不确定这是否是firebase 问题,但我注意到了这一点,

    var wordData = arrayListOf<Word>()
    

    所以请使用SnapshotStateList将其更改为此,

    var wordData = remember { mutableStateListOf<Word>() }
    

    因为您只是将元素添加到标准集合结构中,而不是 compose 可以观察状态变化以更新您的 LazyColumn

    【讨论】:

      【解决方案2】:

      您的代码中的问题在于您尝试使用 wordData 列表,而它仍然为空,因为获取这些 Word 对象的操作尚未完成。为什么?因为 Firebase API 是异步的。在这种情况下,最简单的解决方案是在 for 循环结束后立即移动 LazyColumn 的创建:

      @Composable
      fun getData() {
          var wordData = arrayListOf<Word>()
          db.get().addOnSuccessListener { documents ->
              for (document in documents) {
                  wordData.add(document.toObject(Word::class.java))
              }
              LazyColumn {
                  items(wordData) {  word ->
                      WordCard(word = word)
                  }
              }
          }
      }
      

      由于您将 Kotlin 与 Jetpack Compose 一起使用,我还建议您检查:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        相关资源
        最近更新 更多