Kotlin使用Java回调接口

vih*_*kat 6 kotlin kotlin-interop

我有一个WebView.我想打电话

public void evaluateJavascript(String script, ValueCallback<String> resultCallback)
Run Code Online (Sandbox Code Playgroud)

这种方法.

这是ValueCallback接口:

public interface ValueCallback<T> {
    /**
     * Invoked when the value is available.
     * @param value The value.
     */
    public void onReceiveValue(T value);
};
Run Code Online (Sandbox Code Playgroud)

这是我的kotlin代码:

webView.evaluateJavascript("a", ValueCallback<String> {
            // cant override function
        })
Run Code Online (Sandbox Code Playgroud)

有人想知道在kotlin中覆盖onReceiveValue方法吗?我尝试了"将Java转换为Kotlin",但结果是下一个:

v.evaluateJavascript("e") {  }
Run Code Online (Sandbox Code Playgroud)

谢谢!

nha*_*man 8

以下行称为SAM转换:

v.evaluateJavascript("e", { value ->
  // Execute onReceiveValue's code
})
Run Code Online (Sandbox Code Playgroud)

每当Java接口只有一个方法时,Kotlin允许您传入lambda而不是实现该接口的对象.

由于lambda是evaluateJavascript函数的最后一个参数,你可以将它移到括号之外,这就是Java to Kotlin转换的作用:

v.evaluateJavascript("e") { value ->
  // Execute onReceiveValue's code
}
Run Code Online (Sandbox Code Playgroud)


Ruc*_*oom 6

你已经是.大括号之间的内容是onReceive函数的内容.Kotlin自动处理来自Java的SAM转换.以下所有内容都是等效的.

// Use Kotlin's SAM conversion
webView.evaluateJavascript("a") {
    println(it)  // "it" is the implicit argument passed in to this function
}

// Use Kotlin's SAM conversion with explicit variable name
webView.evaluateJavascript("a") { value ->
    println(value)
}

// Specify SAM conversion explicitly
webView.evalueateJavascript("a", ValueCallback<String>() {
    println(it)
})

// Use an anonymous class
webView.evalueateJavascript("a", object : ValueCallback<String>() {
    override fun onReceiveValue(value: String) {
        println(value)
    }
})
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是Kotlin的一个特色.来自文档:"在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且您将lambda表达式作为相应的参数传递,则可以在括号外指定它:"https:// kotlinlang.org/docs/reference/lambdas.html (3认同)