在存储库类中具有以下侦听器:
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()
显示为红色。如何解决这个问题?如果有任何帮助,我们将不胜感激。
2条答案
按热度按时间sg2wtvxw1#
我不知道你为什么要这么做:
这段代码启动了一个不必要的协程(不调用任何挂起或阻塞代码),获取一个StateFlow引用并立即释放该引用,函数本身返回一个Job(启动的协程)。当您
launch
一个协程时,协程不会产生任何返回值。它只返回一个Job示例,您可以使用它等待它完成或提前取消它。存储库函数已经创建了一个在传递的作用域中运行的StateFlow,并且已经传递了
viewModelScope
,因此StateFlow已经在原始代码fun getState() = repo.getState(viewModelScope)
中的viewModelScope
中运行。g52tjvyc2#
使用实时数据将状态流的结果从视图模型发送到活动。在视图模型中执行以下操作:
在您的Activity observer中,您的liveData如下所示:
希望能有所帮助。