在 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>
在
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,那么为什么要让它难以在收集器中使用呢?