繁体   English   中英

如何在初始化时调用挂起函数?

[英]How to call suspend function on init?

我在这里有点迷路,我不太明白挂起功能是如何工作的,所以有什么提示或解决这个问题吗?

在里面:

init {
    val settings = FirebaseFirestoreSettings.Builder()
        .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
        .build()
    db.firestoreSettings = settings
    credentials = getCredentials() // Throws 'Suspend function 'getCredentials' should be called only from a coroutine or another suspend function'
}

暂停功能:

// ... this function is defined for my repository interface
override suspend fun getCredentials(): Resource<CredentialsDTO> {
        return try {
            if(this::credentials.isInitialized)
                Resource.Success(credentials)
            else {
                val _credentials = api.getCredentials()
                credentials = _credentials 
            }
        } catch(e: Exception) {
            e.printStackTrace()
            Resource.Error("Error thrown: ${e.localizedMessage}")
        }
    }

您还没有告诉我们这个init块的位置,但解决方案正如它所说:您必须从协程调用您的挂起函数。

所以你真正要问的是如何启动协程。 但是,这取决于您在哪里进行init 建议的现代架构是使用ViewModel ,您可以在其中使用ViewModelScope.launch启动协程。 launch中,您可以自由使用挂起功能。 ViewModel ,然后您可以在所需的任何视图中使用。

有关详细信息,请参阅这些:

随着您的学习,这种架构一开始会引入一些复杂性,但从长远来看会更加健壮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM