Flutter InAppWebView 如何一进入就默认打开软件盘
webView和软件盘的问题,网上有很多很多的文章。找了很多,有用的没用的一大堆。
今天主要说一下 flutter InAppWebView中如何已进入就调去软键盘。
H5里面,无论是aotoFocus还时document.getElementById('xxx').focus();
在iOS还是android上都是无效的。当时就凉凉,不过解决这个问题iOS还是有办法的。
iOS
看了这个老哥的文章,分分钟解决了 blog.csdn.net/c_furong/ar…
在flutter iOS文件,由于InAppWebView用的是WKWebView,在appDelegate里面,执行下方法即可。代码是oc的 flutter已经给我们见好了桥文件,自己写个oc的class 转一下,在appDelegate调用一下即可
Andorid
接下来就是安卓,找了很多文章,最后终结于只能通过js的hander处理。InAppWebView与js的调用在这就好说了,只讲键盘的事。
1、调键盘,一定要用原生来调。那怎么用flutter里面直接掉原生的方法呢?
第一时间在 InAppWebViewController Api中找,找到了下面两个方法。
requestFocusNodeHref()
clearFocus()
clearFocus()一目了然,关闭键盘的。那requestFocusNodeHref()是干什么用的呢。
官方文档:请求回调得到 RequestFocusNodeHrefResult对象,在看看RequestFocusNodeHrefResult呢,貌似和键盘啥的没啥关系。那我要不把requestFocusNodeHref()的方法改了呢。直接open我的android studio。 这个这个回掉的地方,直接给改了。在我心里,requestFocusNodeHref()方法就应该是请求弹出键盘的,尽然他不是,那就让他是就好了。
找到InAppWebViewMethodHander。413行,直接换掉。
收到js软键盘打开的请求,直接来个controller.requestFocusNodeHref();搞定。
附上代码:收工!
case "requestFocusNodeHref":
if (webView != null) {
try {
webView.requestFocus();
InputMethodManager inputManager =
(InputMethodManager) webView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputManager != null) {
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
result.success(true);
}
} catch (Exception e) {
result.success(null);
}
} else {
result.success(null);
}
break;