EvaluateJavaScript只允许返回types的字符串?
我做了一个通用的函数(在Kotlin中),我可以根据给定的命令调用JavaScript函数。
fun evaluateJsFromNative(command: String, webView: WebView, function: (value : String) -> Unit ) { webView.evaluateJavascript("(function() { return $command; })();") { s -> function(s) } }
但是,它只允许将值String
作为返回types。 如果我希望它是更通用的东西,我可以返回布尔types,诠释,甚至什么都没有,我怎么能使这更通用?
例如,我不能这样做…它会在function(s)
声明需要是String
fun evaluateJsFromNative(command: String, webView: WebView, function: (value : Boolean) -> Unit ) { webView.evaluateJavascript("(function() { return $command; })();") { s -> function(s) } }
你得到的错误是因为你已经定义了你的函数接受一个布尔参数,但是你在s -> function(s)
中传递一个String参数。 这是一个字符串,因为这是如何定义WebView.evalueateJavascript()
。
你不能改变webView.evaluateJavascript()
接受的函数的types。 但是,您可以将String参数转换为布尔值,然后使用该参数调用您的函数。
例如(使用你的第二个实现采取布尔):
fun evaluateJsFromNative(command: String, webView: WebView, function: (value : Boolean) -> Unit ) { webView.evaluateJavascript("(function() { return $command; })();") { s -> function(s.toBoolean()) } } // you would call it like this... evaluateJsFromNative(mycommand, mywebview) { Log.d("SomeTag","Value=$it") }
但是这是非常简单的,因为你可以提供任何字符串作为命令,包括非Javascript。 文档中说evaluateJavascript()
的函数参数只会在Javascript计算为null
以外的null
时才被调用( 注意 ,如果你的WebView没有启用Javascript,它将调用你的函数的值为'null'
)。 所以,即使假设你传递好的Javascript,返回非null, s
仍然可能不能成功转换为Boolean
。 换句话说,要处理错误的输入参数以及处理您不期望的types,您有很多工作要做。
但是你问了一些更通用的东西。 所以这里是一个尝试; 你将不得不展开你支持的所有types(当然还有error handling)的when
语句。
fun evaluateJsFromNative(command: String, webView: WebView, klass: Class , function: (value : Any?) -> Unit ) { webView.evaluateJavascript("(function() { return $command; })();") { s -> if (s.convert(klass) != null) function(s.convert(klass)!!) } } fun String.convert(klass: Class ) : Any? { when (klass.name.toString()) { "boolean" -> return this.toBoolean() else -> return null } } // call it like this... evaluateJsFromNative(mycommand, mywebview, Boolean::class.java) { Log.d("SomeTag","Value=$it") }
这个例子要求你从Javascript中指定你所期望的types,然后你必须从一个字符串中解析出你期望的types。 而且您必须预先定义您将支持的types。 如果转换比较简单,那将会很好,但是可惜的是,Kotlin论坛中根据这篇文章没有这种types的Kotlin转换
我希望这有帮助