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

Commit d4ad3b1

Browse files
Geert-Johan RiemerGeertJohan
authored andcommitted
[webview_flutter] Expose loadData function for webviews
1 parent ee5f424 commit d4ad3b1

5 files changed

Lines changed: 76 additions & 0 deletions

File tree

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
@@ -121,6 +121,9 @@ public void onMethodCall(MethodCall methodCall, Result result) {
121121
case "loadUrl":
122122
loadUrl(methodCall, result);
123123
break;
124+
case "loadData":
125+
loadData(methodCall, result);
126+
break;
124127
case "updateSettings":
125128
updateSettings(methodCall, result);
126129
break;
@@ -174,6 +177,18 @@ private void loadUrl(MethodCall methodCall, Result result) {
174177
result.success(null);
175178
}
176179

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

packages/webview_flutter/ios/Classes/FlutterWebView.m

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
105105
[self onUpdateSettings:call result:result];
106106
} else if ([[call method] isEqualToString:@"loadUrl"]) {
107107
[self onLoadUrl:call result:result];
108+
} else if ([[call method] isEqualToString:@"loadData"]) {
109+
[self onLoadData:call result:result];
108110
} else if ([[call method] isEqualToString:@"canGoBack"]) {
109111
[self onCanGoBack:call result:result];
110112
} else if ([[call method] isEqualToString:@"canGoForward"]) {
@@ -152,6 +154,17 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
152154
}
153155
}
154156

157+
- (void)onLoadData:(FlutterMethodCall*)call result:(FlutterResult)result {
158+
if (![self loadData:[call arguments]]) {
159+
result([FlutterError
160+
errorWithCode:@"loadData_failed"
161+
message:@"Failed parsing the data"
162+
details:[NSString stringWithFormat:@"Request was: '%@'", [call arguments]]]);
163+
} else {
164+
result(nil);
165+
}
166+
}
167+
155168
- (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result {
156169
BOOL canGoBack = [_webView canGoBack];
157170
result([NSNumber numberWithBool:canGoBack]);
@@ -351,6 +364,20 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
351364
return true;
352365
}
353366

367+
- (bool)loadData:(NSDictionary<NSString*, id>*)request {
368+
if (!request) {
369+
return false;
370+
}
371+
372+
NSString* data = request[@"data"];
373+
NSString* baseUrl = request[@"baseUrl"];
374+
NSString* mimeType = request[@"mimeType"];
375+
NSString* encoding = request[@"encoding"];
376+
NSData* nsData = [data dataUsingEncoding:NSUTF8StringEncoding];
377+
NSURL* nsUrl = [NSURL URLWithString:baseUrl];
378+
return [_webView loadData:nsData MIMEType:mimeType characterEncodingName:encoding baseURL:nsUrl];
379+
}
380+
354381
- (void)registerJavaScriptChannels:(NSSet*)channelNames
355382
controller:(WKUserContentController*)userContentController {
356383
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)