Я пытался с модулями загрузки / выгрузки Koin ... и в течение короткого периода времени это работало, но позже, после минимального изменения, я не смог заставить его перезагрузить снова.
ВВ конце концов, я решил это с помощью объекта-оболочки:
class DynamicRetrofit(private val gson: Gson) {
private fun buildClient() = OkHttpClient.Builder()
.build()
private var baseUrl = "https://etc..." //default url
private fun buildApi() = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(buildClient())
.build().create(MyApi::class.java)
var api: MyApi = buildApi()
private set
fun setUrl(url: String) {
if (baseUrl != url)
baseUrl = url
api = buildApi()
}}
Я объявляю это внутри модуля Koin следующим образом:
single<DynamicRetrofit>()
{
DynamicRetrofit(get(), get())
}
и использую его довольно стандартным способом:
dynamicRetrofit.api.makeSomeRequest()
Это было хорошее решение для моего случая, так как я очень редко меняю baseUrl. Если вам нужно делать частые и параллельные звонки на два разных сервера, это, вероятно, будет неэффективно, так как вы часто воссоздаете HTTP-клиент.