在改造 api 调用期间没有调用流中的函数

问题描述 投票:0回答:1

在 api 期间,'flow{}' 中的代码没有被调用,下面是我的执行顺序。 执行从视图模型开始

private fun getAppConfig() = viewModelScope.launch {
        _appConfigFlow.update {
            AppConfigState.Loading
        }
        val response = getAppConfigUseCase.invoke()
    }

下面是用例

class GetAppConfigUseCase @Inject constructor(
    private val repository: AppConfigRepository
) {
    suspend operator fun invoke() = withContext(Dispatchers.IO) {
        repository.getAppConfig()
    }
}

下面是存储库

interface AppConfigRepository {
    suspend fun getAppConfig(): Flow<Result<AppConfig>?>
}

下面是存储库实现

@Singleton
class AppConfigRepositoryImp @Inject constructor(
    private val remoteDataSource: AppConfigRemoteDataSource
) : AppConfigRepository {

    override suspend fun getAppConfig(): Flow<Result<AppConfig>?> = flow {
        remoteDataSource.getAppConfigData()
    }
}

下面是远程数据源

interface AppConfigRemoteDataSource {
    suspend fun getAppConfigData(): Flow<Result<AppConfig>?>
}

远程数据源实现

class AppConfigRemoteDataSourceImpl @Inject constructor(
    private val apiService: ApiService
) : AppConfigRemoteDataSource {
    override suspend fun getAppConfigData(): Flow<Result<AppConfig>?> = toResultFlow {
        apiService.getAppConfig()
    }

    private fun <T> toResultFlow(call: suspend () -> Response<T>?): Flow<Result<T>?> {
        return flow {
            emit(Result.Loading)
        }
    }
}

我在上面的函数中添加了调试器,我可以看到除了“apiService.getAppConfig()”之外的所有其他函数都被调用了。它没有被调用,所以没有得到任何结果。但是,如果我使用改装的正常响应,我会得到响应,但在使用流程时不会。请帮我找到解决办法 这是 api 服务

@GET(".")
    suspend fun getAppConfig(): Response<AppConfig>
android kotlin retrofit2 kotlin-coroutines kotlin-flow
1个回答
0
投票

AppConfigRemoteDataSourceImpl.toResultFlow()
中,你只返回一个发出加载状态的流,没有别的。它会忽略您传递给它的 lambda 参数。

你可能打算这样做:

    private fun <T> toResultFlow(call: suspend () -> Response<T>?): Flow<Result<T>?> {
        return flow {
            emit(Result.Loading)
            emit(call())
        }
    }

我建议使用

Flow<Result<T>>
而不是
Flow<Result<T>?>
。在任何情况下,您的 Flow 都不会发出 null,那么为什么要让它难以在收集器中使用呢?

© www.soinside.com 2019 - 2024. All rights reserved.