kotlin 如何在viewModelScope中调用ViewModel中的函数?

yhived7q  于 2022-12-19  发布在  Kotlin
关注(0)|答案(2)|浏览(209)

在存储库类中具有以下侦听器:

override fun getState(viewModelScope: CoroutineScope) = callbackFlow  {
    val listener = FirebaseAuth.AuthStateListener { auth ->
        trySend(auth.currentUser == null)
    }
    auth.addAuthStateListener(listener)
    awaitClose {
        auth.removeAuthStateListener(listener)
    }
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), auth.currentUser == null)

在我的ViewModel类中,我调用getState函数,该函数使用以下代码返回StateFlow<Boolean>

fun getState() = repo.getState(viewModelScope)

我收集数据:

setContent {
    val state = viewModel.getState().collectAsState().value
}

如果我在ViewModel中更改:

fun getState() = viewModelScope.launch {
    repo.getState(this)
}

所以可以从viewModelScope调用,我不能再收集数据了,因为.collectAsState()显示为红色。如何解决这个问题?如果有任何帮助,我们将不胜感激。

sg2wtvxw

sg2wtvxw1#

我不知道你为什么要这么做:

fun getState() = viewModelScope.launch {
    repo.getState(this)
}

这段代码启动了一个不必要的协程(不调用任何挂起或阻塞代码),获取一个StateFlow引用并立即释放该引用,函数本身返回一个Job(启动的协程)。当您launch一个协程时,协程不会产生任何返回值。它只返回一个Job示例,您可以使用它等待它完成或提前取消它。
存储库函数已经创建了一个在传递的作用域中运行的StateFlow,并且已经传递了viewModelScope,因此StateFlow已经在原始代码fun getState() = repo.getState(viewModelScope)中的viewModelScope中运行。

g52tjvyc

g52tjvyc2#

使用实时数据将状态流的结果从视图模型发送到活动。在视图模型中执行以下操作:

var isActive = MutableLiveData<Boolean>();

    fun getState() {
    viewModelScope.launch {
        repo.getState(this).onStart {

        }
            .collect(){
                isActive.value = it;
            }
    }

}

在您的Activity observer中,您的liveData如下所示:

viewModel.isActive.observe(this, Observer {
                Toast.makeText(applicationContext,it.toString(),Toast.LENGTH_LONG).show()
            })

希望能有所帮助。

相关问题