我有一个
BaseUseCase
类,以这种方式编排状态:
abstract class BaseUseCase<T, in P: UseCaseParameters> {
protected abstract suspend fun FlowCollector<Result<T>>.run(params: P)
operator fun invoke(params: P) =
flow {
emit(State.Loading)
run(params)
emit(State.Loaded)
}.flowOn(Dispatchers.IO)
}
的预期输出
Flow.collect{}
范围是:
State.Loading
State.Success / State.Error // where I get the success or error data
State.Loaded
到目前为止,它对API调用等运行良好。现在,我有了一个特定的实现,从资产中读取JSON文件并将其发送到流中。对于这种情况,它只是在发射
Loading
和
Loaded
州。
以下是实现的其余部分:
ViewModel:
private fun getAllCards() {
viewModelScope.launch {
getAllCardsUseCase(None()).collect {
val printData: String = when (it) {
is State -> it.toString()
is Failure -> it.errorData.message.toString()
is Success -> {
it.successData.cardList.first().name }
}
Timber.d("ALL CARDS RESPONSE = $printData")
}
}
}
用例:
class GetAllCardsUseCase<T : ViewEntity> @Inject constructor(
private val mapper: @JvmSuppressWildcards Mapper<ArrayList<Card>, T>,
private val cardRepository: CardRepository
) : BaseUseCase<T, None>() {
override suspend fun FlowCollector<Result<T>>.run(params: None) {
cardRepository.getCardList(mapper = mapper)
}
}
存储库:
override suspend fun <T : ViewEntity> getCardList(mapper: Mapper<ArrayList<Card>, T>): Result<T> =
readCardListFromFile()?.let {
Success(successData = mapper.convert(it))
} ?: run {
Failure(errorData = ParsingError())
}
正在中成功检索JSON数据并将其映射到模型中
let{}
块
getCardList()
按预期返回成功状态,但它从未被发出。我错过了什么?