关于webview_flutter文本复制功能问题

问题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了。

 

关于webview_flutter文本复制功能问题

上一篇:sublime配置nodejs环境


下一篇:关于webadi