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

local html and baseUrl support #2730

Closed
wants to merge 18 commits into from
Closed
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
4 changes: 4 additions & 0 deletions packages/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.3.21+1

* static html and baseUrl support.

## 0.3.21

* Enable programmatic scrolling using Android's WebView.scrollTo & iOS WKWebView.scrollView.contentOffset.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public class FlutterWebView implements PlatformView, MethodCallHandler {
private final MethodChannel methodChannel;
private final FlutterWebViewClient flutterWebViewClient;
private final Handler platformThreadHandler;
private String baseUrl;

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -65,7 +66,15 @@ public class FlutterWebView implements PlatformView, MethodCallHandler {
String userAgent = (String) params.get("userAgent");
updateUserAgent(userAgent);
}
if (params.containsKey("initialUrl")) {
if (params.containsKey("html")) {
String html = (String) params.get("html");
if (params.containsKey("baseUrl")) {
baseUrl = (String) params.get("baseUrl");
webView.loadDataWithBaseURL(baseUrl, html, "text/html", "UTF-8", null);
} else {
webView.loadData(html, "text/html", "UTF-8");
}
} else if (params.containsKey("initialUrl")) {
String url = (String) params.get("initialUrl");
webView.loadUrl(url);
}
Expand Down Expand Up @@ -122,6 +131,9 @@ public void onMethodCall(MethodCall methodCall, Result result) {
case "loadUrl":
loadUrl(methodCall, result);
break;
case "loadHtml":
loadHtml(methodCall, result);
break;
case "updateSettings":
updateSettings(methodCall, result);
break;
Expand Down Expand Up @@ -187,6 +199,20 @@ private void loadUrl(MethodCall methodCall, Result result) {
result.success(null);
}

@SuppressWarnings("unchecked")
private void loadHtml(MethodCall methodCall, Result result) {
Map<String, Object> request = (Map<String, Object>) methodCall.arguments;
String html = (String) request.get("html");
if (html != null) {
if (baseUrl != null) {
webView.loadDataWithBaseURL(baseUrl, html, "text/html", "UTF-8", null);
} else {
webView.loadData(html, "text/html", "UTF-8");
}
}
result.success(null);
}

private void canGoBack(Result result) {
result.success(webView.canGoBack());
}
Expand Down
33 changes: 30 additions & 3 deletions packages/webview_flutter/ios/Classes/FlutterWebView.m
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,27 @@ - (instancetype)initWithFrame:(CGRect)frame
// TODO(amirh): return an error if apply settings failed once it's possible to do so.
// https://github.com/flutter/flutter/issues/36228

NSString* initialUrl = args[@"initialUrl"];
if ([initialUrl isKindOfClass:[NSString class]]) {
[self loadUrl:initialUrl];
NSString* html = args[@"html"];
if ([html isKindOfClass:[NSString class]]) {
NSString* baseURLString = args[@"baseUrl"];
if ([baseURLString isKindOfClass:[NSString class]]) {
baseURL = [NSURL URLWithString:baseURLString];
[_webView loadHTMLString:html baseURL:baseURL];
} else {
[_webView loadHTMLString:html baseURL:nil];
}
} else {
NSString* initialUrl = args[@"initialUrl"];
if ([initialUrl isKindOfClass:[NSString class]]) {
[self loadUrl:initialUrl];
}
}
}
return self;
}

NSURL* baseURL = nil;

- (UIView*)view {
return _webView;
}
Expand All @@ -128,6 +141,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:@"loadHtml"]) {
[self onLoadHtml:call result:result];
} else if ([[call method] isEqualToString:@"canGoBack"]) {
[self onCanGoBack:call result:result];
} else if ([[call method] isEqualToString:@"canGoForward"]) {
Expand Down Expand Up @@ -183,6 +198,18 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
}
}

- (void)onLoadHtml:(FlutterMethodCall*)call result:(FlutterResult)result {
NSString* html = [call arguments][@"html"];
if ([html isKindOfClass:[NSString class]]) {
if (baseURL != nil) {
[_webView loadHTMLString:html baseURL:baseURL];
} else {
[_webView loadHTMLString:html baseURL:nil];
}
}
result(nil);
}

- (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result {
BOOL canGoBack = [_webView canGoBack];
result([NSNumber numberWithBool:canGoBack]);
Expand Down
16 changes: 16 additions & 0 deletions packages/webview_flutter/lib/platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,14 @@ abstract class WebViewPlatformController {
"WebView loadUrl is not implemented on the current platform");
}

/// Loads the specified html.
///
/// `html` must not be null.
Future<void> loadHtml(String html) {
throw UnimplementedError(
"WebView loadHtml 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.
Expand Down Expand Up @@ -420,6 +428,8 @@ class CreationParams {
/// The `autoMediaPlaybackPolicy` parameter must not be null.
CreationParams({
this.initialUrl,
this.html,
this.baseUrl,
this.webSettings,
this.javascriptChannelNames,
this.userAgent,
Expand All @@ -432,6 +442,12 @@ class CreationParams {
/// When null the webview will be created without loading any page.
final String initialUrl;

/// The initial baseUrl to load in the webview. It will work with html only.
final String baseUrl;

/// The initial html to load in the webview. This will be preferred over initialUrl if it exists.
final String html;

/// The initial [WebSettings] for the new webview.
///
/// This can later be updated with [WebViewPlatformController.updateSettings].
Expand Down
17 changes: 16 additions & 1 deletion packages/webview_flutter/lib/src/webview_method_channel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController {
});
}

@override
Future<void> loadHtml(String html) async {
return _channel.invokeMethod<void>('loadHtml', <String, dynamic>{
'html': html,
});
}

@override
Future<String> currentUrl() => _channel.invokeMethod<String>('currentUrl');

Expand Down Expand Up @@ -190,12 +197,20 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController {
/// [AndroidWebViewBuilder] and [CupertinoWebViewBuilder].
static Map<String, dynamic> creationParamsToMap(
CreationParams creationParams) {
return <String, dynamic>{
var creationParamMap = <String, dynamic>{
'initialUrl': creationParams.initialUrl,
'settings': _webSettingsToMap(creationParams.webSettings),
'javascriptChannelNames': creationParams.javascriptChannelNames.toList(),
'userAgent': creationParams.userAgent,
'autoMediaPlaybackPolicy': creationParams.autoMediaPlaybackPolicy.index,
};

if (creationParams.html != null) {
creationParamMap['html'] = creationParams.html;
}
if (creationParams.baseUrl != null) {
creationParamMap['baseUrl'] = creationParams.baseUrl;
}
return creationParamMap;
}
}
19 changes: 19 additions & 0 deletions packages/webview_flutter/lib/webview_flutter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ class WebView extends StatefulWidget {
Key key,
this.onWebViewCreated,
this.initialUrl,
this.html,
this.baseUrl,
this.javascriptMode = JavascriptMode.disabled,
this.javascriptChannels,
this.navigationDelegate,
Expand Down Expand Up @@ -210,6 +212,12 @@ class WebView extends StatefulWidget {
/// The initial URL to load.
final String initialUrl;

/// The initial baseURL to load.
final String baseUrl;

/// The initial static html to load.
final String html;

/// Whether Javascript execution is enabled.
final JavascriptMode javascriptMode;

Expand Down Expand Up @@ -389,6 +397,8 @@ class _WebViewState extends State<WebView> {
CreationParams _creationParamsfromWidget(WebView widget) {
return CreationParams(
initialUrl: widget.initialUrl,
html: widget.html,
baseUrl: widget.baseUrl,
webSettings: _webSettingsFromWidget(widget),
javascriptChannelNames: _extractChannelNames(widget.javascriptChannels),
userAgent: widget.userAgent,
Expand Down Expand Up @@ -548,6 +558,15 @@ class WebViewController {
return _webViewPlatformController.loadUrl(url, headers);
}

/// Loads the specified html.
///
/// `html` must not be null.
///
Future<void> loadHtml(String html) async {
assert(html != null);
return _webViewPlatformController.loadHtml(html);
}

/// Accessor to the current URL that the WebView is displaying.
///
/// If [WebView.initialUrl] was never specified, returns `null`.
Expand Down
2 changes: 1 addition & 1 deletion packages/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: webview_flutter
description: A Flutter plugin that provides a WebView widget on Android and iOS.
version: 0.3.21
version: 0.3.21+1
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter

environment:
Expand Down