Как преобразовать обратный вызов внутри ответного обратного вызова от Java до Kotlin - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в 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

    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 голосов
/ 07 декабря 2018

Спасибо, Роланд, за помощь!

Вот последний правильный ответ за помощь.

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)
}
0 голосов
/ 07 декабря 2018

На самом деле это говорит это там на картинке ... вы используете () -> Unit, и вы должны использовать UtilsCallback вместо ...

Возможно, следующее уже будет работать:

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

Или, по крайней мере, решение, вероятно, будет очень похоже на это.

Обновление: я предполагал, что это был интерфейс Java ... Для вашей второй ошибки, пожалуйста, посмотрите также Kotlin:Интерфейс ... не имеет конструкторов .

В этом конкретном случае я бы предпочел заменить ваш UtilsCallback аналогичным подходящим функциональным аналогом, например () -> Unit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...