我正在使用--library jvm-retrofit2和coroutines=true使用open-api codegen生成代碼。我正在撰寫一個使用 REST API 的 Android kotlin 客戶端庫。我不想只向我的庫的用戶提供原始的 Retrofit Response,所以我想像這樣覆寫它:
open class ApiBook : RetrofitBooksApi {
companion object {
private fun getRetrofitService(): RetrofitBooksApi {
val apiClient = ApiClient()
return apiClient.createService(RetrofitBooksApi::class.java)
}
suspend fun getBooksList(...): MyCustomResponse<List<Book>> {
return getBooksList(...)
}
}
override suspend fun getBooksList(
...
): MyCustomResponse<List<Book>> {
// Custom implementation, handling of errors, nulls, etc. and passing a
// MyCustomResponse.Success or MyCustomResponse.Error object back.
}
}
MainActivity {
...
val response = ApiBook.getBooksList()
...
}
這只是一個草稿,但正如你所看到的不僅僅是丑陋的。問題是,如果我不從生成的 Retrofit 介面 (RetrofitBooksApi) 擴展類,當我有一天從 REST API 規范重新運行代碼生成時,我不會看到介面中添加了新方法,所以我雖然可能我可以從介面擴展并覆寫它們,但現在我有一個問題,我需要呼叫伴隨塊內的覆寫函式,我不確定在每個函式中實體化類以便能夠呼叫在外部覆寫函式,如果我可以讓函式名稱在內部和外部相同。第二個問題是我無法真正將覆寫函式的回傳型別更改為我的自定義回應物件,那么首先覆寫該函式是沒有意義的,
uj5u.com熱心網友回復:
如果我正確理解您的情況,那么您只需創建一個實作RetrofitBooksApi以下內容的單例就可以使它變得更簡單:
object ApiBook : RetrofitBooksApi {
override suspend fun getBooksList() { ... }
private fun getRetrofitService(): RetrofitBooksApi { ... }
}
MainActivity {
...
val response = ApiBook.getBooksList()
...
}
只要新的回傳型別是原始型別的子型別,您就應該能夠覆寫回傳型別。如果它不是子型別,那么您的ApiBookAPI 確實RetrofitBooksApi與我不同,我相信您需要手動保持它們同步。另一種方法是撰寫一個編譯器插件。我不知道 Retrofit 是否對此類情況有任何幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345182.html
上一篇:KotlinFlow最佳實踐
下一篇:合成用分隔線繪制的圓形邊框筆劃
