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转换

我希望这有帮助