Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -37,4 +39,13 @@ public void onPageFinished(WebView view, String url) {
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 changes: 11 additions & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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
Expand All @@ -111,6 +121,7 @@ class _MyHomePageState extends State<MyHomePage> {
_onDestroy.cancel();
_onUrlChanged.cancel();
_onStateChanged.cancel();
_onHttpError.cancel();

flutterWebviewPlugin.dispose();

Expand Down
9 changes: 9 additions & 0 deletions ios/Classes/FlutterWebviewPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,15 @@ - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigatio
[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) {
Expand Down
17 changes: 13 additions & 4 deletions lib/src/base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}
}
Expand All @@ -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
Expand Down Expand Up @@ -162,7 +164,7 @@ class FlutterWebviewPlugin {
_onDestroy.close();
_onUrlChanged.close();
_onStateChanged.close();
_onError.close();
_onHttpError.close();
_instance = null;
}

Expand Down Expand Up @@ -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);
}