问题1:webview_flutter文本复制功能怎么开启?
最近在开发过程中有复制网页上的文本的需求,项目使用的时flutter官方的webview_flutter。我使用的场景如下:
1、通过点击listview获取服务器的网页内容,由于情况需要特殊性,所以不是通过url直接访问的,而是把获取的的内容就是网页转成String对象,在通过加载本地文件的方式加载出来。
2、由于需要开启网页内容复制功能,所以如下设置:
@override void initState() { super.initState(); if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); }
3、当点击进入显示页面时,出现了有时显示的出来,有时显示不出来的情况。当显示不出来的时候,出现的错误是:bad state:Future already complete.这个提示的意思就future对象已经调用过了completer()函数一次,现在又掉用一次所以就抛出了这个异常,使得程序中断,webview无法渲染完成。所以看到的事白色的什么都没显示。
解决:
webview的控制器声明使用completer包裹起来,就是使用Future对象。
Completer<WebViewController> _controller = Completer<WebViewController>();
控制器的赋值是在onWebViewCreated属性中.
onWebViewCreated: (WebViewController webViewController) { if(!_controller.isCompleted) { _controller.complete(webViewController); } },
所有使用控制器的地方都使用future来调用。比如:
_controller.future.then((controller) {
controller.evaluateJavascript(jsStr).then((result) {
print(result);
});
这样就可以正常显示了。
问题2:
当我其他控件把webview遮挡住后,在遮挡控件销毁后,再回到webview页面时,也出现了有的时候页面能显示内容,有的时候显示不了内容的问题。
分析:
经过我debug跟踪分析,webview有的时候回重新构建,这个时候就会和之前已经构建过的的webview的控制器冲突,future会被调用2次。所以也会报异常退出。出现这个问题的原因是系统再回到webview的时候,WebView.platform被系统设置成了默认值:AndroidWebView,而不是我们需要的SurfaceAndroidWebView,所以导致了重新构建问题。
解决:
再buildWebview前重新设置一下
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
就可以了,这样系统就不会重新构建webview了。