Selaa lähdekoodia

Add support of HTTP errors.

Roman Rodych 7 vuotta sitten
vanhempi
commit
ed9b4e338b

+ 1 - 1
android/src/main/AndroidManifest.xml

@@ -3,5 +3,5 @@
           android:versionCode="1"
           android:versionName="0.0.1">
 
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21"/>
+    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
 </manifest>

+ 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("onError", data);
+    }
 }

+ 1 - 1
example/android/app/src/main/AndroidManifest.xml

@@ -3,7 +3,7 @@
     android:versionCode="1"
     android:versionName="0.0.1">
 
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" />
+    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
 
     <!-- The INTERNET permission is required for development. Specifically,
          flutter needs it to communicate with the running application

+ 11 - 0
example/lib/main.dart

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

+ 9 - 0
ios/Classes/FlutterWebviewPlugin.m

@@ -181,6 +181,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:@"onError" 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) {

+ 12 - 3
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 _onError = new StreamController<WebViewError>.broadcast();
 
   static FlutterWebviewPlugin _instance;
 
@@ -38,10 +38,10 @@ class FlutterWebviewPlugin {
         _onUrlChanged.add(call.arguments["url"]);
         break;
       case "onState":
-        _onStateChanged.add(new WebViewStateChanged.fromMap(call.arguments));
+        _onStateChanged.add(WebViewStateChanged.fromMap(call.arguments));
         break;
       case "onError":
-        _onError.add(call.arguments);
+        _onError.add(WebViewError(call.arguments['code'], call.arguments['url']));
         break;
     }
   }
@@ -57,6 +57,8 @@ class FlutterWebviewPlugin {
   /// more detail than other events
   Stream<WebViewStateChanged> get onStateChanged => _onStateChanged.stream;
 
+  Stream<WebViewError> get onError => _onError.stream;
+
   /// Start the Webview with [url]
   /// - [withJavascript] enable Javascript or not for the Webview
   ///     iOS WebView: Not implemented yet
@@ -172,3 +174,10 @@ class WebViewStateChanged {
     return new WebViewStateChanged(t, map["url"], map["navigationType"]);
   }
 }
+
+class WebViewError {
+  final String url;
+  final String code;
+
+  WebViewError(this.code, this.url);
+}