Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 5c8d136

Browse files
Geert-Johan RiemerGeertJohan
authored andcommitted
[webview_flutter] Expose loadData function for webviews
1 parent d256f56 commit 5c8d136

File tree

5 files changed

+72
-0
lines changed

5 files changed

+72
-0
lines changed

packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ public void onMethodCall(MethodCall methodCall, Result result) {
174174
case "loadUrl":
175175
loadUrl(methodCall, result);
176176
break;
177+
case "loadData":
178+
loadData(methodCall, result);
179+
break;
177180
case "updateSettings":
178181
updateSettings(methodCall, result);
179182
break;
@@ -239,6 +242,18 @@ private void loadUrl(MethodCall methodCall, Result result) {
239242
result.success(null);
240243
}
241244

245+
@SuppressWarnings("unchecked")
246+
private void loadData(MethodCall methodCall, Result result) {
247+
Map<String, Object> request = (Map<String, Object>) methodCall.arguments;
248+
String baseUrl = (String) request.get("baseUrl");
249+
String data = (String) request.get("data");
250+
String mimeType = (String) request.get("mimeType");
251+
String encoding = (String) request.get("encoding");
252+
webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, "");
253+
result.success(null);
254+
}
255+
256+
242257
private void canGoBack(Result result) {
243258
result.success(webView.canGoBack());
244259
}

packages/webview_flutter/ios/Classes/FlutterWebView.m

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
128128
[self onUpdateSettings:call result:result];
129129
} else if ([[call method] isEqualToString:@"loadUrl"]) {
130130
[self onLoadUrl:call result:result];
131+
} else if ([[call method] isEqualToString:@"loadData"]) {
132+
[self onLoadData:call result:result];
131133
} else if ([[call method] isEqualToString:@"canGoBack"]) {
132134
[self onCanGoBack:call result:result];
133135
} else if ([[call method] isEqualToString:@"canGoForward"]) {
@@ -183,6 +185,17 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
183185
}
184186
}
185187

188+
- (void)onLoadData:(FlutterMethodCall*)call result:(FlutterResult)result {
189+
if (![self loadData:[call arguments]]) {
190+
result([FlutterError
191+
errorWithCode:@"loadData_failed"
192+
message:@"Failed parsing the data"
193+
details:[NSString stringWithFormat:@"Request was: '%@'", [call arguments]]]);
194+
} else {
195+
result(nil);
196+
}
197+
}
198+
186199
- (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result {
187200
BOOL canGoBack = [_webView canGoBack];
188201
result([NSNumber numberWithBool:canGoBack]);
@@ -412,6 +425,20 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
412425
return true;
413426
}
414427

428+
- (bool)loadData:(NSDictionary<NSString*, id>*)request {
429+
if (!request) {
430+
return false;
431+
}
432+
433+
NSString* data = request[@"data"];
434+
NSString* baseUrl = request[@"baseUrl"];
435+
NSString* mimeType = request[@"mimeType"];
436+
NSString* encoding = request[@"encoding"];
437+
NSData* nsData = [data dataUsingEncoding:NSUTF8StringEncoding];
438+
NSURL* nsUrl = [NSURL URLWithString:baseUrl];
439+
return [_webView loadData:nsData MIMEType:mimeType characterEncodingName:encoding baseURL:nsUrl];
440+
}
441+
415442
- (void)registerJavaScriptChannels:(NSSet*)channelNames
416443
controller:(WKUserContentController*)userContentController {
417444
for (NSString* channelName in channelNames) {

packages/webview_flutter/lib/platform_interface.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ abstract class WebViewPlatformController {
182182
"WebView loadUrl is not implemented on the current platform");
183183
}
184184

185+
Future<void> loadData(
186+
String baseUrl, String data, String mimeType, String encoding) {
187+
throw UnimplementedError(
188+
"WebView loadData is not implemented on the current platform");
189+
}
190+
185191
/// Updates the webview settings.
186192
///
187193
/// Any non null field in `settings` will be set as the new setting value.

packages/webview_flutter/lib/src/webview_method_channel.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,22 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController {
8080
});
8181
}
8282

83+
@override
84+
Future<void> loadData(
85+
String baseUrl,
86+
String data,
87+
String mimeType,
88+
String encoding
89+
) async {
90+
print("loadData call");
91+
return _channel.invokeMethod<void>('loadData', <String, dynamic>{
92+
'baseUrl': baseUrl,
93+
'data': data,
94+
'mimeType': mimeType,
95+
'encoding': encoding,
96+
});
97+
}
98+
8399
@override
84100
Future<String> currentUrl() => _channel.invokeMethod<String>('currentUrl');
85101

packages/webview_flutter/lib/webview_flutter.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,14 @@ class WebViewController {
613613
return _webViewPlatformController.loadUrl(url, headers);
614614
}
615615

616+
Future<void> loadData(
617+
String baseUrl,
618+
String data,
619+
String mimeType,
620+
String encoding) async {
621+
return _webViewPlatformController.loadData(baseUrl, data, mimeType, encoding);
622+
}
623+
616624
/// Accessor to the current URL that the WebView is displaying.
617625
///
618626
/// If [WebView.initialUrl] was never specified, returns `null`.

0 commit comments

Comments
 (0)