web-dev-qa-db-ja.com

Kotlin(Android)でRetrofit @PartMapエラーが発生したマルチパートリクエスト

このコードをJava=で使用している場合、正常に機能します。kotlinでそのコードを変換すると、エラーが発生します。

Logcat

08-20 23:46:51.003 3782-3782/com.qkangaroo.app W/System.err:Java.lang.IllegalArgumentException:パラメータタイプにタイプ変数またはワイルドカードを含めることはできません:Java.util.Map(パラメータ#1) 08-20 23:46:51.003 3782-3782/com.qkangaroo.app W/System.err:メソッドApiInterface.updateCustomerDetail 08-20 23:46:51.003 3782-3782/com.qkangaroo.app W/System.err :at retrofit2.ServiceMethod $ Builder.methodError(ServiceMethod.Java:752)08-20 23:46:51.004 3782-3782/com.qkangaroo.app W/System.err:at retrofit2.ServiceMethod $ Builder.methodError(ServiceMethod。 Java:743)08-20 23:46:51.004 3782-3782/com.qkangaroo.app W/System.err:at retrofit2.ServiceMethod $ Builder.parameterError(ServiceMethod.Java:761)08-20 23:46:51.004 3782-3782/com.qkangaroo.app W/System.err:at retrofit2.ServiceMethod $ Builder.build(ServiceMethod.Java:195)08-20 23:46:51.004 3782-3782/com.qkangaroo.app W/System .err:at retrofit2.Retrofit.loadServiceMethod(Retrofit.Java:170)08-20 23:46:51.005 3782-3782/com.qkangaroo.app W/System.err:a t retrofit2.Retrofit $ 1.invoke(Retrofit.Java:147)08-20 23:46:51.005 3782-3782/com.qkangaroo.app W/System.err:at $ Proxy0.updateCustomerDetail(Native Method)08-20 23 :46:51.005 3782-3782/com.qkangaroo.app W/System.err:at com.qkangaroo.app.Fragments.MoreScreen.MoreFragment.updateProfile(MoreFragment.kt:261)08-20 23:46:51.006 3782- 3782/com.qkangaroo.app W/System.err:at com.qkangaroo.app.Fragments.MoreScreen.MoreFragment $ clickListener $ 1.onClick(MoreFragment.kt:191)08-20 23:46:51.006 3782-3782/com .qkangaroo.app W/System.err:at Android.view.View.performClick(View.Java:3517)08-20 23:46:51.006 3782-3782/com.qkangaroo.app W/System.err:at Android .view.View $ PerformClick.run(View.Java:14155)08-20 23:46:51.006 3782-3782/com.qkangaroo.app W/System.err:at Android.os.Handler.handleCallback(Handler.Java :605)08-20 23:46:51.007 3782-3782/com.qkangaroo.app W/System.err:at Android.os.Handler.dispatchMessage(Handler.Java:92)08-20 23:46:51.007 3782 -3782/com.qkangaroo.app W/System.err:Androidで。 os.Looper.loop(Looper.Java:154)08-20 23:46:51.007 3782-3782/com.qkangaroo.app W/System.err:at Android.app.ActivityThread.main(ActivityThread.Java:4624) 08-20 23:46:51.008 3782-3782/com.qkangaroo.app W/System.err:at Java.lang.reflect.Method.invokeNative(Native Method)08-20 23:46:51.009 3782-3782/com .qkangaroo.app W/System.err:at Java.lang.reflect.Method.invoke(Method.Java:511)08-20 23:46:51.009 3782-3782/com.qkangaroo.app W/System.err: com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.Java:809)08-20 23:46:51.010 3782-3782/com.qkangaroo.app W/System.err:at com.Android.internal .os.ZygoteInit.main(ZygoteInit.Java:576)08-20 23:46:51.011 3782-3782/com.qkangaroo.app W/System.err:at dalvik.system.NativeStart.main(Native Method)

fragment.kt

    var map:HashMap<String,RequestBody> = HashMap<String, RequestBody>()
    map.put("version",ApiClient.createRequestBody(AppConstants.API_VERSION))
    map.put("auth_token", ApiClient.createRequestBody(customer.authToken!!))
    map.put("customer_name",ApiClient.createRequestBody(profileName))
    map.put("email", ApiClient.createRequestBody(profileEmail))

    val apiInterface = ApiClient.client.create(ApiInterface::class.Java)

    val updateCustomerCall: Call<UpdateCustomer> = apiInterface.updateCustomerDetail(map)
    updateCustomerCall.enqueue(object : Callback<UpdateCustomer> {
        override fun onResponse(call: Call<UpdateCustomer>?, response: Response<UpdateCustomer>?) {

        }

        override fun onFailure(call: Call<UpdateCustomer>?, t: Throwable?) {
            utilities!!.hideProgress(progress)
        }
    })

ApiClient.kt

val MULTIPART_FORM_DATA = "multipart/form-data"

fun createRequestBody(s: String): RequestBody {
    return RequestBody.create(
            MediaType.parse(MULTIPART_FORM_DATA), s)
}

ApiInterface、.kt

@Multipart
@POST("customer")
fun updateCustomerDetail(@PartMap map: Map<String,RequestBody >): Call<UpdateCustomer>

Gradleファイル

implementation "com.squareup.okhttp3:okhttp:3.8.1"
implementation "com.squareup.okhttp3:logging-interceptor:3.8.1"
implementation ("com.squareup.retrofit2:retrofit:2.3.0"){
     exclude module: 'okhttp'
}
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
17
Jagnesh Chawla

追加 @JvmSuppressWildcardsの前RequestBody

fun updateCustomerDetail(@PartMap map: Map<String, @JvmSuppressWildcards RequestBody >): Call<UpdateCustomer>
39
Jagnesh Chawla

Map <K、out V>の代わりにHashMapまたはMutableMapを使用しますPartMap

私にとってはうまくいく代替の方法。 Retrofi Kotlin Issuetpom6ohに言及

Map宣言がパブリックインターフェイスMap <K、out V>であり、Out Wordが値の型をジェネリックにするため、それが起こっていると思います。代わりにMutableMapまたはHashMapを使用してみてください。

@Multipart
@POST("customer")
fun updateCustomerDetail(@PartMap map: HashMap<String, RequestBody>): Call<UpdateCustomer>