webview_flutter
webview_flutter沒有SSL Error接口,也就是說等你的網頁出現SSL 錯誤的時候這個插件無法捕捉處理,除非你改它的源碼。
下面這段是webview_flutter官網的例子,它有onHttpError、onWebResourceError、但沒有任何捕捉?SSL 錯誤的選項,我曾經不信邪找了很久。
controller = WebViewController()..setJavaScriptMode(JavaScriptMode.unrestricted)..setBackgroundColor(const Color(0x00000000))..setNavigationDelegate(NavigationDelegate(onProgress: (int progress) {// Update loading bar.},onPageStarted: (String url) {},onPageFinished: (String url) {},onHttpError: (HttpResponseError error) {},onWebResourceError: (WebResourceError error) {},onNavigationRequest: (NavigationRequest request) {if (request.url.startsWith('https://www.youtube.com/')) {return NavigationDecision.prevent;}return NavigationDecision.navigate;},),)..loadRequest(Uri.parse('https://flutter.dev'));
通過日志發現可以取巧提醒SSL Error ,?SSL Error不會走onPageStarted,可以在這里加flag,然后在pageFinished的時候做判斷即可。
flutter_inappwebview
但是另一個webview的插件flutter_inappwebview可以捕捉 ,這個插件感覺接口更多一點。
SSL Error接口使用onReceivedServerTrustAuthRequest捕捉。
InAppWebView(key: webViewKey,initialUrlRequest: URLRequest(url: WebUri("https://www.baidu.com/?tn=02003390_20_hao_pg")),initialSettings: settings,pullToRefreshController: pullToRefreshController,onWebViewCreated: (controller) {webViewController = controller;},onReceivedServerTrustAuthRequest: (controller, challenge) async {//解決 handshake failed問題print("onReceivedServerTrustAuthRequest $challenge");return ServerTrustAuthResponse(action: ServerTrustAuthResponseAction.PROCEED);},onLoadStart: (controller, url) {setState(() {this.url = url.toString();urlController.text = this.url;});},onPermissionRequest: (controller, request) async {return PermissionResponse(resources: request.resources,action: PermissionResponseAction.GRANT);},shouldOverrideUrlLoading:(controller, navigationAction) async {var uri = navigationAction.request.url!;return NavigationActionPolicy.ALLOW;},onLoadStop: (controller, url) async {pullToRefreshController?.endRefreshing();setState(() {this.url = url.toString();urlController.text = this.url;});},onReceivedError: (controller, request, error) {pullToRefreshController?.endRefreshing();},onProgressChanged: (controller, progress) {if (progress == 100) {pullToRefreshController?.endRefreshing();}setState(() {this.progress = progress / 100;urlController.text = url;});},onUpdateVisitedHistory: (controller, url, androidIsReload) {setState(() {this.url = url.toString();urlController.text = this.url;});},onConsoleMessage: (controller, consoleMessage) {if (kDebugMode) {print(consoleMessage);}},),