Как использовать лямбда-выражения в Kotlin Android с классами, которые имеют два или более методов обратного вызова - PullRequest
0 голосов
/ 19 февраля 2019

Давайте создадим сценарий, который у нас есть onClickListener () в java

view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
    Toast.makeText(v.getContext(), "Click", Toast.LENGTH_SHORT).show();
}});

мы можем использовать лямбда-выражения в kotlin, чтобы упростить

 view.setOnClickListener({ view -> toast("Click")})

что если у нас есть класс илиинтерфейс с двумя или более обратными вызовами, как этот: -

Service.MakeApiCall(new OnCallListener() {
  @Override
  public void onSuccess(View v) {
    //some code
  }

  @Override
  public void onError(String x){
    //some code
  }
});

Как использовать лямбда-выражение в такой ситуации, как OnClickListener Пример

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Лямбды могут применяться только для функциональных интерфейсов.Вместо этого используйте объект

val listener = object : OnCallListener() {
        override fun onSuccess(v: View) {
            //some code
        }

        override fun onError(x: String){
            //some code
        }
    }
0 голосов
/ 19 февраля 2019

Это невозможно.Лямбда-выражения - это всего лишь один метод.

Существует обходной путь.Вы можете создать свою собственную функцию расширения, которая принимает две лямбды:

fun Service.MakeApiCall(success: (View) -> Unit, 
                        error: (String) -> Unit) {
     MakeApiCall(object: OnCallListener {
        override fun onSuccess(v: View) {
            success(v)
        }

        override fun onError(x: String) {
            error(x)
        }
    })
}

API, который вы пытаетесь имитировать, похож на шаблон Observer.Возможно, Kotlin Coroutines поможет https://kotlinlang.org/docs/reference/coroutines-overview.html

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