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

Commit 8461a0d

Browse files
Geert-Johan RiemerGeertJohan
authored andcommitted
[webview_flutter] Expose loadData function for webviews
1 parent 3af2bfa commit 8461a0d

File tree

5 files changed

+76
-0
lines changed

5 files changed

+76
-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
@@ -122,6 +122,9 @@ public void onMethodCall(MethodCall methodCall, Result result) {
122122
case "loadUrl":
123123
loadUrl(methodCall, result);
124124
break;
125+
case "loadData":
126+
loadData(methodCall, result);
127+
break;
125128
case "updateSettings":
126129
updateSettings(methodCall, result);
127130
break;
@@ -175,6 +178,18 @@ private void loadUrl(MethodCall methodCall, Result result) {
175178
result.success(null);
176179
}
177180

181+
@SuppressWarnings("unchecked")
182+
private void loadData(MethodCall methodCall, Result result) {
183+
Map<String, Object> request = (Map<String, Object>) methodCall.arguments;
184+
String baseUrl = (String) request.get("baseUrl");
185+
String data = (String) request.get("data");
186+
String mimeType = (String) request.get("mimeType");
187+
String encoding = (String) request.get("encoding");
188+
webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, "");
189+
result.success(null);
190+
}
191+
192+
178193
private void canGoBack(Result result) {
179194
result.success(webView.canGoBack());
180195
}

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"]) {
@@ -175,6 +177,17 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
175177
}
176178
}
177179

180+
- (void)onLoadData:(FlutterMethodCall*)call result:(FlutterResult)result {
181+
if (![self loadData:[call arguments]]) {
182+
result([FlutterError
183+
errorWithCode:@"loadData_failed"
184+
message:@"Failed parsing the data"
185+
details:[NSString stringWithFormat:@"Request was: '%@'", [call arguments]]]);
186+
} else {
187+
result(nil);
188+
}
189+
}
190+
178191
- (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result {
179192
BOOL canGoBack = [_webView canGoBack];
180193
result([NSNumber numberWithBool:canGoBack]);
@@ -374,6 +387,20 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
374387
return true;
375388
}
376389

390+
- (bool)loadData:(NSDictionary<NSString*, id>*)request {
391+
if (!request) {
392+
return false;
393+
}
394+
395+
NSString* data = request[@"data"];
396+
NSString* baseUrl = request[@"baseUrl"];
397+
NSString* mimeType = request[@"mimeType"];
398+
NSString* encoding = request[@"encoding"];
399+
NSData* nsData = [data dataUsingEncoding:NSUTF8StringEncoding];
400+
NSURL* nsUrl = [NSURL URLWithString:baseUrl];
401+
return [_webView loadData:nsData MIMEType:mimeType characterEncodingName:encoding baseURL:nsUrl];
402+
}
403+
377404
- (void)registerJavaScriptChannels:(NSSet*)channelNames
378405
controller:(WKUserContentController*)userContentController {
379406
for (NSString* channelName in channelNames) {

packages/webview_flutter/lib/platform_interface.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ abstract class WebViewPlatformController {
6464
"WebView loadUrl is not implemented on the current platform");
6565
}
6666

67+
Future<void> loadData(
68+
String baseUrl,
69+
String data,
70+
String mimeType,
71+
String encoding
72+
) {
73+
throw UnimplementedError(
74+
"WebView loadData is not implemented on the current platform");
75+
}
76+
6777
/// Updates the webview settings.
6878
///
6979
/// 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
@@ -60,6 +60,22 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController {
6060
});
6161
}
6262

63+
@override
64+
Future<void> loadData(
65+
String baseUrl,
66+
String data,
67+
String mimeType,
68+
String encoding
69+
) async {
70+
print("loadData call");
71+
return _channel.invokeMethod<void>('loadData', <String, dynamic>{
72+
'baseUrl': baseUrl,
73+
'data': data,
74+
'mimeType': mimeType,
75+
'encoding': encoding,
76+
});
77+
}
78+
6379
@override
6480
Future<String> currentUrl() => _channel.invokeMethod<String>('currentUrl');
6581

packages/webview_flutter/lib/webview_flutter.dart

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

534+
Future<void> loadData(
535+
String baseUrl,
536+
String data,
537+
String mimeType,
538+
String encoding) async {
539+
return _webViewPlatformController.loadData(baseUrl, data, mimeType, encoding);
540+
}
541+
534542
/// Accessor to the current URL that the WebView is displaying.
535543
///
536544
/// If [WebView.initialUrl] was never specified, returns `null`.

0 commit comments

Comments
 (0)