問題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了。