Kotlin使用Java回调接口。

7
我有一个WebView。我想调用
public void evaluateJavascript(String script, ValueCallback<String> resultCallback)

这个方法。

这里是ValueCallback接口:

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

这是我的 Kotlin 代码:

webView.evaluateJavascript("a", ValueCallback<String> {
            // cant override function
        })

有没有人知道如何在 Kotlin 中重写 onReceiveValue 方法? 我尝试了“将 Java 转换为 Kotlin”,但结果是这样的:

v.evaluateJavascript("e") {  }

谢谢!

2个回答

12
以下行称为SAM转换: SAM conversions
v.evaluateJavascript("e", { value ->
  // Execute onReceiveValue's code
})

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

由于 lambda 是 evaluateJavascript 函数的最后一个参数,因此您可以将其移动到括号外面,这也是 Java 到 Kotlin 的转换所做的。

v.evaluateJavascript("e") { value ->
  // Execute onReceiveValue's code
}

7

你已经是。括号之间的内容是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)
    }
})

你确定第一和第二个括号)的位置吗? - weston
3
是的,这是 Kotlin 的一个特性。根据文档所述:“在 Kotlin 中,函数的最后一个参数如果是函数,并且你将 lambda 表达式作为对应的参数传递,你可以在圆括号外指定它:”。具体内容请参考 https://kotlinlang.org/docs/reference/lambdas.html。 - Ruckus T-Boom
1
很好。非常全面的答案。 - weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接