[英]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.