Мне нужно передать некоторую функцию приостановки, которая выполнит вызов дооснащения и возвратит ответ другой функции в качестве параметра.Таким образом, моя функция приостановки может иметь любое количество аргументов с любыми типами, как я могу определить ее как функциональный тип, чтобы иметь возможность передавать ее другой функции, которая вызовет ее?
interface SomeDataSource {
@GET("some_url")
suspend fun getObjects(@Path("id") userId: String): Response<A>
@PUT("some_url")
suspend fun updateClientFirstName(@Path("id") id: String, @Body requestA: RequestA): Response<Unit>
}
class SomeRepositoryImpl(private val someDataSource: SomeDataSource) : SomeRepository {
override suspend fun getObjects(userId: String): List<A>? {
return baseRequestMaker(params.., true, someDataSource::getObjects)
}
}
suspend fun <P, T> baseRequestMaker(params: P, isShowLoader: Boolean = true, request: suspend (input: P) -> Response<T>): T? {
if (isShowLoader) {
BaseFragment.apiState.value = Result.Loading
}
return withContext(Dispatchers.IO + BaseBanqrCoroutineExceptionHandler(CoroutineExceptionHandler)) {
val apiResponse = request(params)
val response = apiResponse.body()
GlobalScope.launch(Dispatchers.Main + BaseBanqrCoroutineExceptionHandler(CoroutineExceptionHandler)) {
BaseFragment.apiState.value = Result.Success(response)
}
return@withContext response
}
}
Проблема в том, что в моем запросе параметры функции могут иметь любой тип и количество, и я не могу их обернуть в объект, потому что в этом случае аннотации Retrofit, такие как @Path, @Query, @Body
.., не будут работать.