diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index bfb79a39e8ba..9788c8372828 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -174,6 +174,9 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "loadUrl": loadUrl(methodCall, result); break; + case "loadData": + loadData(methodCall, result); + break; case "updateSettings": updateSettings(methodCall, result); break; @@ -239,6 +242,18 @@ private void loadUrl(MethodCall methodCall, Result result) { result.success(null); } + @SuppressWarnings("unchecked") + private void loadData(MethodCall methodCall, Result result) { + Map request = (Map) methodCall.arguments; + String baseUrl = (String) request.get("baseUrl"); + String data = (String) request.get("data"); + String mimeType = (String) request.get("mimeType"); + String encoding = (String) request.get("encoding"); + webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, ""); + result.success(null); + } + + private void canGoBack(Result result) { result.success(webView.canGoBack()); } diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 969e010913f3..f8c26fb36aba 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -128,6 +128,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self onUpdateSettings:call result:result]; } else if ([[call method] isEqualToString:@"loadUrl"]) { [self onLoadUrl:call result:result]; + } else if ([[call method] isEqualToString:@"loadData"]) { + [self onLoadData:call result:result]; } else if ([[call method] isEqualToString:@"canGoBack"]) { [self onCanGoBack:call result:result]; } else if ([[call method] isEqualToString:@"canGoForward"]) { @@ -183,6 +185,17 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result { } } +- (void)onLoadData:(FlutterMethodCall*)call result:(FlutterResult)result { + if (![self loadData:[call arguments]]) { + result([FlutterError + errorWithCode:@"loadData_failed" + message:@"Failed parsing the data" + details:[NSString stringWithFormat:@"Request was: '%@'", [call arguments]]]); + } else { + result(nil); + } +} + - (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result { BOOL canGoBack = [_webView canGoBack]; result([NSNumber numberWithBool:canGoBack]); @@ -412,6 +425,20 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary*) return true; } +- (bool)loadData:(NSDictionary*)request { + if (!request) { + return false; + } + + NSString* data = request[@"data"]; + NSString* baseUrl = request[@"baseUrl"]; + NSString* mimeType = request[@"mimeType"]; + NSString* encoding = request[@"encoding"]; + NSData* nsData = [data dataUsingEncoding:NSUTF8StringEncoding]; + NSURL* nsUrl = [NSURL URLWithString:baseUrl]; + return [_webView loadData:nsData MIMEType:mimeType characterEncodingName:encoding baseURL:nsUrl]; +} + - (void)registerJavaScriptChannels:(NSSet*)channelNames controller:(WKUserContentController*)userContentController { for (NSString* channelName in channelNames) { diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 6c991b14a76e..048a1432ca78 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -182,6 +182,12 @@ abstract class WebViewPlatformController { "WebView loadUrl is not implemented on the current platform"); } + Future loadData( + String baseUrl, String data, String mimeType, String encoding) { + throw UnimplementedError( + "WebView loadData is not implemented on the current platform"); + } + /// Updates the webview settings. /// /// Any non null field in `settings` will be set as the new setting value. diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index 348b225bb257..4ae2d5e1c1b2 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -80,6 +80,22 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { }); } + @override + Future loadData( + String baseUrl, + String data, + String mimeType, + String encoding + ) async { + print("loadData call"); + return _channel.invokeMethod('loadData', { + 'baseUrl': baseUrl, + 'data': data, + 'mimeType': mimeType, + 'encoding': encoding, + }); + } + @override Future currentUrl() => _channel.invokeMethod('currentUrl'); diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 2fdf639180a7..5f023cb36492 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -613,6 +613,14 @@ class WebViewController { return _webViewPlatformController.loadUrl(url, headers); } + Future loadData( + String baseUrl, + String data, + String mimeType, + String encoding) async { + return _webViewPlatformController.loadData(baseUrl, data, mimeType, encoding); + } + /// Accessor to the current URL that the WebView is displaying. /// /// If [WebView.initialUrl] was never specified, returns `null`.