代码之家  ›  专栏  ›  技术社区  ›  sgurdag

通过FlowCollector而不是emit()发出数据无效

  •  0
  • sgurdag  · 技术社区  · 2 年前

    我有一个 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() 按预期返回成功状态,但它从未被发出。我错过了什么?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Vlad Guriev    2 年前

    请尝试添加 emit() 被否决者 run() 的函数 GetAllCardsUseCase :

    override suspend fun FlowCollector<Result<T>>.run(params: None) {
        emit(cardRepository.getCardList(mapper = mapper))
    }
    
    推荐文章