簡體   English   中英

如何在 viewModelScope 的 ViewModel 中調用一個函數?

[英]How to call a function from in ViewModel in viewModelScope?

在存儲庫類中有這個監聽器:

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 類中,我使用以下方法調用返回StateFlow<Boolean>getState函數:

fun getState() = repo.getState(viewModelScope)

我收集數據:

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

如果我更改 ViewModel:

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

所以它可以從 viewModelScope 調用,我無法再收集數據,因為.collectAsState()顯示為紅色。 如何解決這個問題? 任何幫助將不勝感激。

我不確定你為什么要這樣做:

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

此代碼啟動一個不必要的協程(不調用任何掛起或阻塞代碼)獲取 StateFlow 引用並立即釋放該引用,函數本身返回一個 Job(啟動的協程)。 當您launch協程時,協程不會產生任何返回值。 它只返回一個 Job 實例,您可以使用它來等待它完成或提前取消它。

您的存儲庫函數已經創建了一個在傳遞的范圍內運行的viewModelScope ,並且您已經將它傳遞給viewModelScope ,因此您的 StateFlow 已經在原始代碼fun getState() = repo.getState(viewModelScope)的 viewModelScope 中運行。

使用實時數據將狀態流的結果從視圖模型發送到活動。 在您的視圖模型中這樣做:

 var isActive = MutableLiveData<Boolean>();

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

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

}

在你的活動觀察者中,你的 liveData 是這樣的:

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

希望它會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM