關於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了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM