我是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)
}
它通过上面的代码转换了我的代码,我不明白为什么。
下面是错误消息:
也许我必须使用另一种方式?例如,我的目的是从成功的异步响应中获取我的数据,以便更新我的活动。
感谢阅读。
编辑
我还发布了以前的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)
}
编辑3:我的Kotlin界面
package com.util.my3ciapplication
import com.model.my3ciapplication.Users
interface UtilsCallback {
fun onData(user: Users)
}
答案 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)
}