如何将改造后的回调响应中的回调从Java转换为Kotlin

时间:2018-12-07 09:11:08

标签: java kotlin callback

我是Kotlin的新手,我有一个简单的问题: 我将所有项目从Java转换为kotlin,并通过文档成功纠正了所有错误。

但是我没有成功将java改装回调响应内的回叫转换为Kotlin。

fun getUserAccountController(token: String, callback: UtilsCallback): Users {

        userAccountServices.getUserAccount(token).enqueue(object : Callback<Result> {
            override fun onResponse(call: Call<Result>, response: Response<Result>) {
                if (response.isSuccessful) {
                    Log.i("Callback TOKEN ok ==> ", response.body()!!.resultUser!!.name)
                    user.name = response.body()!!.resultUser!!.name
                    user.username = response.body()!!.resultUser!!.username

                    callback.onData(user) // ==> Here my CALLBACK function
                } else {
                    user.username = ""
                    user.name = ""
                    callback.onData(user) // ==> Here my CALLBACK function
                }
            }

            override fun onFailure(call: Call<Result>, t: Throwable) {
                Log.i("Callback TOKEN Nok ==> ", "error")
            }
        })
        return user
    }

我的回调是函数callback.onData

   Handler().postDelayed({
        user = userAccountController.getUserAccountController(token) {
            fullName!!.text = user.name
            firstName!!.text = user.name
            email!!.text = user.username
        }
    }, 50)
}

它通过上面的代码转换了我的代码,我不明白为什么。

下面是错误消息:

Kotlin code showing 'type mismatch' error

也许我必须使用另一种方式?例如,我的目的是从成功的异步响应中获取我的数据,以便更新我的活动。

感谢阅读。

编辑

我还发布了以前的JAVA代码,效果很好

new Handler().postDelayed(new Runnable(){
        @Override
        public void run(){
            user = userAccountController.getUserAccountController(token, new UtilsCallback() {
                        @Override
                        public void onData(Users userBack) {
                            fullName.setText(user.getName());
                            firstName.setText(user.getName());
                            email.setText(user.getUsername());
                        }
                    });
        }
    },50);
}

编辑2 @Roland建议的新的Kotlin代码

    Handler().postDelayed({
        user = userAccountController.getUserAccountController(token, UtilsCallback {
            fullName!!.text = user.name
            firstName!!.text = user.name
            email!!.text = user.username
        })
    }, 50)
}

Kotlin code showing 'interface does not have constructors' error

编辑3:我的Kotlin界面

    package com.util.my3ciapplication

import com.model.my3ciapplication.Users

interface UtilsCallback {

    fun onData(user: Users)
}

2 个答案:

答案 0 :(得分:1)

实际上它在图片中说出来了……您使用() -> Unit,而应该使用UtilsCallback ...

以下内容可能已经起作用:

Handler().postDelayed({
  user = userAccountController.getUserAccountController(token, UtilsCallback {
        fullName!!.text = user.name
        firstName!!.text = user.name
        email!!.text = user.username
    })
  }, 50)

或者至少解决方案可能与此非常相似。

更新:我假设这是一个Java接口...对于您的第二个错误,请同时查看Kotlin: Interface ... does not have constructors

在那种特定情况下,我宁愿用类似的适当功能替代品来替换您的UtilsCallback,例如() -> Unit

答案 1 :(得分:0)

感谢罗兰(Roland)的帮助!

这是帮助的最终正确答案。

val obj = object : UtilsCallback{
        override fun onData(user: Users) {
            fullName!!.text = user.name
            firstName!!.text = user.name
            email!!.text = user.username
        }
    }

    Handler().postDelayed({
        user = userAccountController.getUserAccountController(token, obj)
    }, 50)
}