【问题标题】:function inside ViewModel not working when calling itViewModel 中的函数在调用时不起作用
【发布时间】:2021-12-28 07:50:41
【问题描述】:

我有一个在 ViewModel 中获取用户数据的函数,但是当我调用该函数时它不起作用

class ViewModel : ViewModel() {
    init { getUsers(uid) }
    val list : MutableLiveData<MutableList<String>> = MutableLiveData()
    fun getUsers(uid:String) {
        FirebaseFirestore.getInstance().collection(user)
            .document(uid).get()
            .addOnSuccessListener {
                val username = it.getString("name")
                val userimage = it.getString("image")
                val usersData = ArrayList<String>()
                usersData.add(username!!)
                usersData.add(userimage!!)
                list.value = usersData
            }
    }
}

我正在这样使用它
注意:emptyList 是一个列表变量,其中包含要在加载字符串之前显示的占位符字符串

@Composable
fun help(ViewModel: ViewModel = viewModel()) {
    val list by ViewModel.list.observeAsState(initial = emptyList)
    Column {
        list.forEach {
            Text(text = it)
        }
    }
    Button(onClick = {ViewModel.getUsers(uid)}) {
        Text(text = "Update")
    }
}

新数据未反映在 UI 中
编辑:我没有在此问题中添加显示数据的 Composable 代码

【问题讨论】:

  • 您没有添加任何代码来显示任何数据。您是否尝试过添加日志以查看是否调用了您的侦听器?
  • 我有一个 Composable 来显示数据,但这不起作用
  • 尝试将list = Mutable....放在init {}之上。
  • 请提供有关您如何显示列表的完整代码,因为如果您做得不对,这可能是一个问题。还要在成功回调中设置断点并调试您的应用以了解您是否到达那里。
  • @JeenbekKhydyr 您的答案不起作用,但如果您认为它应该起作用,请更新您的问题谢谢

标签: android mvvm viewmodel android-jetpack-compose


【解决方案1】:

解决方案是将list.value 替换为list.postValue(usersData)

很可能.addOnSuccessListener { ... } 作用域在后台,因此您需要postValue

注意:将val list : MutableLiveDat... 移动到init {} 上方,正如我之前评论的那样。

如果postValue 不能帮助将 LiveData 替换为 StateFlow

【讨论】:

  • 在初始化块之前移动列表定义不会改变任何东西。 Kotlin 在这方面做得很好。
  • @DanielWeidensdörfer 这不是真的。在 init 块中使用成员属性,在它之后声明,实际上被编译器视为错误,会导致异常。尝试运行class Foo{ init{ val bar = foo * 3 } val foo = 3 }
  • @AdrianK 你当然是对的。在 OP 提供的代码中,init 块中没有使用任何属性。因此,如果编译器没有抱怨,那么在 init 块之前移动属性不会改变任何东西。
  • @DanielWeidensdörfer 当然这是吹毛求疵,但从 init 块调用一个方法,该方法又使用未初始化的属性仍然会导致异常,尽管编译器没有抱怨。如果 firebase 同步调用 onSuccess 监听器,就会发生这种情况
  • @DanielWeidensdörfer 我选择了最糟糕的例子来说明我的观点,因为原语不能为空。将未初始化的成员更改为任何非原始成员,例如String 会给你预期的错误
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多