web-dev-qa-db-fra.com

Demande en plusieurs parties avec erreur Retrofit @PartMap dans Kotlin (Android)

Si j'utilise ce code dans Java alors son bon fonctionnement. Lorsque je convertis ce code en kotlin, j'ai eu une erreur.

Logcat

08-20 23: 46: 51.003 3782-3782/com.qkangaroo.app W/System.err: Java.lang.IllegalArgumentException: le type de paramètre ne doit pas inclure de variable de type ou de caractère générique: Java.util.Map (paramètre # 1) 08-20 23: 46: 51.003 3782-3782/com.qkangaroo.app W/System.err: pour la méthode ApiInterface.updateCustomerDetail 08-20 23: 46: 51.003 3782-3782/com.qkangaroo.app W/System.err : à retrofit2.ServiceMethod $ Builder.methodError (ServiceMethod.Java:752) 08-20 23: 46: 51.004 3782-3782/com.qkangaroo.app W/System.err: à 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: à retrofit2.ServiceMethod $ Builder.build (ServiceMethod.Java:195) 08-20 23: 46: 51.004 3782-3782/com.qkangaroo.app W/System .err: à 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: à 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: sur Android.view.View.performClick (View.Java:3517) 08-20 23: 46: 51.006 3782-3782/com.qkangaroo.app W/System.err: sur Android .view.View $ PerformClick.run (View.Java:14155) 08-20 23: 46: 51.006 3782-3782/com.qkangaroo.app W/System.err: sur Android.os.Handler.handleCallback (Handler.Java : 605) 08-20 23: 46: 51.007 3782-3782/com.qkangaroo.app W/System.err: sur Android.os.Handler.dispatchMessage (Handler.Java:92) 08-20 23: 46: 51.007 3782 -3782/com.qkangaroo.app W/System.err: sur Android. os.Looper.loop (Looper.Java:154) 08-20 23: 46: 51.007 3782-3782/com.qkangaroo.app W/System.err: sur 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: à Java.lang.reflect.Method.invoke (Method.Java:511) 08-20 23: 46: 51.009 3782-3782/com.qkangaroo.app W/System.err: sur com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:809) 08-20 23: 46: 51.010 3782-3782/com.qkangaroo.app W/System.err: sur 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>

Fichier 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

Ajouter @JvmSuppressWildcards avant RequestBody

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

Utilisez HashMap ou MutableMap au lieu de Map <K, out V> pour le PartMap

Moyen alternatif qui fonctionne bien pour moi. Mentionné par tpom6oh dans Retrofi Kotlin Issue

Je pense que cela se produit parce que la déclaration de Map est une interface publique Map <K, out V> et le mot de sortie rend le type de valeur générique. Vous pouvez essayer d'utiliser MutableMap ou HashMap à la place.

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