我有一个愚蠢的问题......但我找不到信息。
我创建了一个
Repository.kt
,它使用 Co-Routine
代码如下:
override suspend fun getChallenge(): AwsResult<String> {
return awsApi.getChallenge()
}
AwsAPI部分完成如下:
override suspend fun getChallenge(): AwsResult<String> {
....
return withContext(Dispatchers.IO) {
try {
val reponse: ... => API call through SDK
AwsResult.onSuccess(reponse.text)
} catch (e: Exception) {
AwsResult.onError(e)
}
}
}
我创建了一个
ChallengeUseCase.kt
,它将在将结果发送回 ViewModel 之前包含一些逻辑。
suspend fun registerDevice(): Result<String> {
try {
val result = repository.getChallenge()
} catch (e: Exception) {
}
}
AwsResult
看起来像:
sealed class AwsResult<out R> {
data class onSuccess<out T>(val data: T) : AwsResult<T>()
data class onError(val exception: Exception) : AwsResult<Nothing>()
}
我想知道如何捕获用例文件中的
AwsResult
?目标是提取信息,用它做一些事情,并将业务逻辑实现的结果发送回 viewModel。我认为 result
不会立即包含信息,并且我可能必须定义一个范围或周围的东西。
当我说时,我假设结果不会立即包含信息,这是因为我试图捕获
onSuccess
中的 onResult
和 UseCase.kt
。
有什么想法吗?
您可以使用
onSuccess
运算符提取 onError
或 when
并检查返回的 result
的类型:
suspend fun registerDevice(): Result<String> {
try {
val result: AwsResult<String> = repository.getChallenge()
when (result) {
is AwsResult.onSuccess -> {
val data = result.data
// ... do something when request is success
}
is AwsResult.onError -> {
val exception = result.exception
// ... do something when request is error
}
}
} catch (e: Exception) {
}
}
另外,我不建议以小写字母开头命名 Kotlin 类,好的风格是以大字母开头命名类:
sealed class AwsResult<out R> {
data class Success<out T>(val data: T) : AwsResult<T>()
data class Error(val exception: Exception) : AwsResult<Nothing>()
}