Ver código fonte

Merge pull request #115 from romkor/add_http_error_stream

Add support of HTTP errors
Hadrien Lejard 7 anos atrás
pai
commit
4c44dae3bc

+ 11 - 0
android/src/main/java/com/flutter_webview_plugin/BrowserClient.java

@@ -1,6 +1,8 @@
 package com.flutter_webview_plugin;
 
 import android.graphics.Bitmap;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
@@ -37,4 +39,13 @@ public class BrowserClient extends WebViewClient {
         FlutterWebviewPlugin.channel.invokeMethod("onState", data);
 
     }
+
+    @Override
+    public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
+        super.onReceivedHttpError(view, request, errorResponse);
+        Map<String, Object> data = new HashMap<>();
+        data.put("url", request.getUrl().toString());
+        data.put("code", Integer.toString(errorResponse.getStatusCode()));
+        FlutterWebviewPlugin.channel.invokeMethod("onHttpError", data);
+    }
 }

+ 11 - 0
example/lib/main.dart

@@ -58,6 +58,8 @@ class _MyHomePageState extends State<MyHomePage> {
   // On urlChanged stream
   StreamSubscription<WebViewStateChanged> _onStateChanged;
 
+  StreamSubscription<WebViewHttpError> _onHttpError;
+
   TextEditingController _urlCtrl = new TextEditingController(text: selectedUrl);
 
   TextEditingController _codeCtrl =
@@ -103,6 +105,14 @@ class _MyHomePageState extends State<MyHomePage> {
         });
       }
     });
+
+    _onHttpError = flutterWebviewPlugin.onHttpError.listen((WebViewHttpError error) {
+      if (mounted) {
+        setState(() {
+          _history.add("onHttpError: ${error.code} ${error.url}");
+        });
+      }
+    });
   }
 
   @override
@@ -111,6 +121,7 @@ class _MyHomePageState extends State<MyHomePage> {
     _onDestroy.cancel();
     _onUrlChanged.cancel();
     _onStateChanged.cancel();
+    _onHttpError.cancel();
 
     flutterWebviewPlugin.dispose();
 

+ 9 - 0
ios/Classes/FlutterWebviewPlugin.m

@@ -222,6 +222,15 @@ static NSString *const CHANNEL_NAME = @"flutter_webview_plugin";
     [channel invokeMethod:@"onError" arguments:data];
 }
 
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
+    if ([navigationResponse.response isKindOfClass:[NSHTTPURLResponse class]]) {
+        NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response;
+
+        [channel invokeMethod:@"onHttpError" arguments:@{@"code": [NSString stringWithFormat:@"%ld", response.statusCode], @"url": webView.URL.absoluteString}];
+    }
+    decisionHandler(WKNavigationResponsePolicyAllow);
+}
+
 #pragma mark -- UIScrollViewDelegate
 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
     if (scrollView.pinchGestureRecognizer.isEnabled != _enableZoom) {

+ 13 - 4
lib/src/base.dart

@@ -19,7 +19,7 @@ class FlutterWebviewPlugin {
   final _onDestroy = new StreamController<Null>.broadcast();
   final _onUrlChanged = new StreamController<String>.broadcast();
   final _onStateChanged = new StreamController<WebViewStateChanged>.broadcast();
-  final _onError = new StreamController<String>.broadcast();
+  final _onHttpError = new StreamController<WebViewHttpError>.broadcast();
 
   static FlutterWebviewPlugin _instance;
 
@@ -43,8 +43,8 @@ class FlutterWebviewPlugin {
               new Map<String, dynamic>.from(call.arguments)),
         );
         break;
-      case "onError":
-        _onError.add(call.arguments);
+      case "onHttpError":
+        _onHttpError.add(WebViewHttpError(call.arguments['code'], call.arguments['url']));
         break;
     }
   }
@@ -60,6 +60,8 @@ class FlutterWebviewPlugin {
   /// more detail than other events
   Stream<WebViewStateChanged> get onStateChanged => _onStateChanged.stream;
 
+  Stream<WebViewHttpError> get onHttpError => _onHttpError.stream;
+
   /// Start the Webview with [url]
   /// - [withJavascript] enable Javascript or not for the Webview
   ///     iOS WebView: Not implemented yet
@@ -162,7 +164,7 @@ class FlutterWebviewPlugin {
     _onDestroy.close();
     _onUrlChanged.close();
     _onStateChanged.close();
-    _onError.close();
+    _onHttpError.close();
     _instance = null;
   }
 
@@ -216,3 +218,10 @@ class WebViewStateChanged {
     return new WebViewStateChanged(t, map["url"], map["navigationType"]);
   }
 }
+
+class WebViewHttpError {
+  final String url;
+  final String code;
+
+  WebViewHttpError(this.code, this.url);
+}