From 9f701dd4d3c5b2ca48f5dbe2e31d29d2c3943881 Mon Sep 17 00:00:00 2001 From: Rafal Wachol Date: Thu, 25 Jul 2019 02:15:03 +0100 Subject: [PATCH 1/4] added postUrl for Android webview --- .../webviewflutter/FlutterWebView.java | 26 ++++++++++++++++++- .../lib/platform_interface.dart | 7 +++-- .../lib/src/webview_method_channel.dart | 1 + .../webview_flutter/lib/webview_flutter.dart | 5 ++++ 4 files changed, 36 insertions(+), 3 deletions(-) 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 838987714d31..e813466f0047 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 @@ -8,6 +8,7 @@ import android.content.Context; import android.os.Build; import android.os.Handler; +import android.util.Log; import android.view.View; import android.webkit.WebStorage; import android.webkit.WebViewClient; @@ -17,12 +18,16 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.platform.PlatformView; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Collections; import java.util.List; import java.util.Map; public class FlutterWebView implements PlatformView, MethodCallHandler { private static final String JS_CHANNEL_NAMES_FIELD = "javascriptChannelNames"; + private static final String TAG = "FlutterWebView"; private final InputAwareWebView webView; private final MethodChannel methodChannel; private final FlutterWebViewClient flutterWebViewClient; @@ -53,7 +58,17 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { if (params.containsKey("initialUrl")) { String url = (String) params.get("initialUrl"); - webView.loadUrl(url); + Map postParameters = (Map) params.get("initialPostParameters"); + if(postParameters != null && !postParameters.isEmpty()) { + try { + webView.postUrl(url, initialParametersToString(postParameters).getBytes()); + } catch (UnsupportedEncodingException e) { + Log.e(TAG, "" + e.getMessage(), e); + } + } else { + webView.loadUrl(url); + } + } } @@ -126,6 +141,15 @@ public void onMethodCall(MethodCall methodCall, Result result) { } } + private static String initialParametersToString(Map parameters) throws UnsupportedEncodingException { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : parameters.entrySet()) { + sb.append(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue().toString(), "UTF-8") + "&"); + } + + return sb.deleteCharAt(sb.length() - 1).toString(); + } + @SuppressWarnings("unchecked") private void loadUrl(MethodCall methodCall, Result result) { Map request = (Map) methodCall.arguments; diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index bfb5b6255421..00fdad1d3dd5 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -185,13 +185,16 @@ class WebSettings { /// Configuration to use when creating a new [WebViewPlatformController]. class CreationParams { CreationParams( - {this.initialUrl, this.webSettings, this.javascriptChannelNames}); + {this.initialUrl, this.initialPostParameters, this.webSettings, this.javascriptChannelNames}); /// The initialUrl to load in the webview. /// /// When null the webview will be created without loading any page. final String initialUrl; + /// The initial POST parameters used on initial URL load. + final Map initialPostParameters; + /// The initial [WebSettings] for the new webview. /// /// This can later be updated with [WebViewPlatformController.updateSettings]. @@ -212,7 +215,7 @@ class CreationParams { @override String toString() { - return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames)'; + return '$runtimeType(initialUrl: $initialUrl, initialPostParameters: $initialPostParameters, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames)'; } } diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index ce9988743853..bccf32cca980 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -133,6 +133,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { CreationParams creationParams) { return { 'initialUrl': creationParams.initialUrl, + 'initialPostParameters': creationParams.initialPostParameters, 'settings': _webSettingsToMap(creationParams.webSettings), 'javascriptChannelNames': creationParams.javascriptChannelNames.toList(), }; diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 3c0175e2f22b..a348a3059363 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -115,6 +115,7 @@ class WebView extends StatefulWidget { Key key, this.onWebViewCreated, this.initialUrl, + this.initialPostParameters, this.javascriptMode = JavascriptMode.disabled, this.javascriptChannels, this.navigationDelegate, @@ -174,6 +175,9 @@ class WebView extends StatefulWidget { /// The initial URL to load. final String initialUrl; + /// The initial POST parameters used on initial URL load. + final Map initialPostParameters; + /// Whether Javascript execution is enabled. final JavascriptMode javascriptMode; @@ -315,6 +319,7 @@ class _WebViewState extends State { CreationParams _creationParamsfromWidget(WebView widget) { return CreationParams( initialUrl: widget.initialUrl, + initialPostParameters: widget.initialPostParameters, webSettings: _webSettingsFromWidget(widget), javascriptChannelNames: _extractChannelNames(widget.javascriptChannels), ); From 4a65213062a8c495e52154f0e26df5adb9c482e3 Mon Sep 17 00:00:00 2001 From: Rafal Wachol Date: Thu, 8 Aug 2019 03:13:47 +0100 Subject: [PATCH 2/4] added ios implementation --- .../ios/Classes/FlutterWebView.m | 56 ++++++++++++++++--- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 87cb0f57377b..715fb29a041d 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -77,14 +77,20 @@ - (instancetype)initWithFrame:(CGRect)frame [weakSelf onMethodCall:call result:result]; }]; - [self applySettings:settings]; - // 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]; - } + [self applySettings:settings]; + // 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]]) { + NSMutableDictionary* initialPostParameters = args[@"initialPostParameters"]; + if(initialPostParameters == nil || initialPostParameters == (id)[NSNull null]) { + [self loadUrl:initialUrl]; + } else { + [self loadUrlPost:initialUrl withHeaders:[NSMutableDictionary dictionary] initialParams:initialPostParameters]; + } + + } } return self; } @@ -332,6 +338,40 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary*) return true; } +- (bool)loadUrlPost:(NSString*)url withHeaders:(NSDictionary*)headers initialParams:(NSDictionary*)params { + + NSURL* nsUrl = [NSURL URLWithString:url]; + if (!nsUrl) { + return false; + } + + NSLog(@"got params %@", params); + NSMutableString *resultString = [NSMutableString string]; + for (NSString* key in [params allKeys]){ + if ([resultString length]>0) + [resultString appendString:@"&"]; + [resultString appendFormat:@"%@=%@", key, [params objectForKey:key]]; + } + + NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:nsUrl]; + + + NSData *postData = [resultString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; + NSString *contentLength = [NSString stringWithFormat:@"%d", postData.length]; + + + [request setHTTPMethod:@"POST"]; + [request setHTTPBody:postData]; + [request setValue:contentLength forHTTPHeaderField:@"Content-Length"]; + [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + + + + [request setAllHTTPHeaderFields:headers]; + [_webView loadRequest:request]; + return true; +} + - (void)registerJavaScriptChannels:(NSSet*)channelNames controller:(WKUserContentController*)userContentController { for (NSString* channelName in channelNames) { From 6a913c823ed2ab093f196f0ff81b86212d958e2f Mon Sep 17 00:00:00 2001 From: Rafal Wachol Date: Wed, 20 Nov 2019 13:18:15 +0000 Subject: [PATCH 3/4] Changed initial post parameters to controller postUrl Moved encoding to client side --- .../webviewflutter/FlutterWebView.java | 27 +++++++------ .../ios/Classes/FlutterWebView.m | 39 +++++++------------ .../lib/platform_interface.dart | 19 ++++++--- .../lib/src/webview_method_channel.dart | 12 +++++- .../webview_flutter/lib/webview_flutter.dart | 19 ++++++--- 5 files changed, 68 insertions(+), 48 deletions(-) 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 b2d1996ccfc3..4ccecde07b95 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 @@ -71,17 +71,7 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { } if (params.containsKey("initialUrl")) { String url = (String) params.get("initialUrl"); - Map postParameters = (Map) params.get("initialPostParameters"); - if(postParameters != null && !postParameters.isEmpty()) { - try { - webView.postUrl(url, initialParametersToString(postParameters).getBytes()); - } catch (UnsupportedEncodingException e) { - Log.e(TAG, "" + e.getMessage(), e); - } - } else { - webView.loadUrl(url); - } - + webView.loadUrl(url); } } @@ -116,6 +106,9 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "loadUrl": loadUrl(methodCall, result); break; + case "postUrl": + postUrl(methodCall,result); + break; case "updateSettings": updateSettings(methodCall, result); break; @@ -178,6 +171,18 @@ private void loadUrl(MethodCall methodCall, Result result) { result.success(null); } + @SuppressWarnings("unchecked") + private void postUrl(MethodCall methodCall, Result result) { + Map request = (Map) methodCall.arguments; + String url = (String) request.get("url"); + + byte[] params = (byte[]) request.get("params"); + + webView.postUrl(url, params); + + 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 4a41e225da3c..9d46828f5b52 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -5,6 +5,7 @@ #import "FlutterWebView.h" #import "FLTWKNavigationDelegate.h" #import "JavaScriptChannelHandler.h" +#import @implementation FLTWebViewFactory { NSObject* _messenger; @@ -83,13 +84,7 @@ - (instancetype)initWithFrame:(CGRect)frame NSString* initialUrl = args[@"initialUrl"]; if ([initialUrl isKindOfClass:[NSString class]]) { - NSMutableDictionary* initialPostParameters = args[@"initialPostParameters"]; - if(initialPostParameters == nil || initialPostParameters == (id)[NSNull null]) { - [self loadUrl:initialUrl]; - } else { - [self loadUrlPost:initialUrl withHeaders:[NSMutableDictionary dictionary] initialParams:initialPostParameters]; - } - + [self loadUrl:initialUrl]; } } return self; @@ -104,6 +99,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:@"postUrl"]) { + [self postUrl:call result:result]; } else if ([[call method] isEqualToString:@"canGoBack"]) { [self onCanGoBack:call result:result]; } else if ([[call method] isEqualToString:@"canGoForward"]) { @@ -346,38 +343,28 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary*) return true; } -- (bool)loadUrlPost:(NSString*)url withHeaders:(NSDictionary*)headers initialParams:(NSDictionary*)params { +- (bool) postUrl:(FlutterMethodCall*)call result:(FlutterResult)result { + NSDictionary* args = [call arguments]; + NSString* url = (NSString*)args[@"url"]; NSURL* nsUrl = [NSURL URLWithString:url]; if (!nsUrl) { return false; } - NSLog(@"got params %@", params); - NSMutableString *resultString = [NSMutableString string]; - for (NSString* key in [params allKeys]){ - if ([resultString length]>0) - [resultString appendString:@"&"]; - [resultString appendFormat:@"%@=%@", key, [params objectForKey:key]]; - } - NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:nsUrl]; - - - NSData *postData = [resultString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; - NSString *contentLength = [NSString stringWithFormat:@"%d", postData.length]; + FlutterStandardTypedData* postData = (FlutterStandardTypedData*)args[@"params"]; + NSString* contentLength = @(postData.data.length).stringValue; - [request setHTTPMethod:@"POST"]; - [request setHTTPBody:postData]; - [request setValue:contentLength forHTTPHeaderField:@"Content-Length"]; - [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; - + [request setHTTPBody:postData.data]; + [request setValue:contentLength forHTTPHeaderField:@"Content-Length"]; + [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; - [request setAllHTTPHeaderFields:headers]; [_webView loadRequest:request]; return true; + } - (void)registerJavaScriptChannels:(NSSet*)channelNames diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 6aadf61b8f64..a3d1738d2554 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -61,6 +62,18 @@ abstract class WebViewPlatformController { "WebView loadUrl is not implemented on the current platform"); } + /// Post to the specified URL. + /// + /// `url` must not be null + /// `params` must not be null + /// + /// `params` have to be ascii encoded + /// Throws an ArgumentError if `url` is not a valid URL string. + Future postUrl(String url, Uint8List params) { + throw UnimplementedError( + "Webview postUrl 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. @@ -260,7 +273,6 @@ class WebSettings { class CreationParams { CreationParams({ this.initialUrl, - this.initialPostParameters, this.webSettings, this.javascriptChannelNames, this.userAgent, @@ -273,9 +285,6 @@ class CreationParams { /// When null the webview will be created without loading any page. final String initialUrl; - /// The initial POST parameters used on initial URL load. - final Map initialPostParameters; - /// The initial [WebSettings] for the new webview. /// /// This can later be updated with [WebViewPlatformController.updateSettings]. @@ -304,7 +313,7 @@ class CreationParams { @override String toString() { - return '$runtimeType(initialUrl: $initialUrl, initialPostParameters: $initialPostParameters, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames, UserAgent: $userAgent)'; + return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames, UserAgent: $userAgent)'; } } diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index e19d1f177685..324db57adc15 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:typed_data'; import 'package:flutter/services.dart'; @@ -55,6 +56,16 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { }); } + @override + Future postUrl(String url, Uint8List params) async { + assert(url != null); + assert(params != null); + return _channel.invokeMethod('postUrl', { + 'url': url, + 'params': params, + }); + } + @override Future currentUrl() => _channel.invokeMethod('currentUrl'); @@ -144,7 +155,6 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { CreationParams creationParams) { return { 'initialUrl': creationParams.initialUrl, - 'initialPostParameters': creationParams.initialPostParameters, 'settings': _webSettingsToMap(creationParams.webSettings), 'javascriptChannelNames': creationParams.javascriptChannelNames.toList(), 'userAgent': creationParams.userAgent, diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 05d39ff693e9..ab84d6f80d33 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -134,7 +134,6 @@ class WebView extends StatefulWidget { Key key, this.onWebViewCreated, this.initialUrl, - this.initialPostParameters, this.javascriptMode = JavascriptMode.disabled, this.javascriptChannels, this.navigationDelegate, @@ -198,9 +197,6 @@ class WebView extends StatefulWidget { /// The initial URL to load. final String initialUrl; - /// The initial POST parameters used on initial URL load. - final Map initialPostParameters; - /// Whether Javascript execution is enabled. final JavascriptMode javascriptMode; @@ -364,7 +360,6 @@ class _WebViewState extends State { CreationParams _creationParamsfromWidget(WebView widget) { return CreationParams( initialUrl: widget.initialUrl, - initialPostParameters: widget.initialPostParameters, webSettings: _webSettingsFromWidget(widget), javascriptChannelNames: _extractChannelNames(widget.javascriptChannels), userAgent: widget.userAgent, @@ -508,6 +503,20 @@ class WebViewController { return _webViewPlatformController.loadUrl(url, headers); } + /// Post to the specified URL. + /// + /// `url` must not be null + /// `params` must not be null + /// + /// `params` have to be ascii encoded + /// Throws an ArgumentError if `url` is not a valid URL string. + Future postUrl(String url, List params) async { + assert(url != null); + assert(params != null); + _validateUrlString(url); + return _webViewPlatformController.postUrl(url, params); + } + /// Accessor to the current URL that the WebView is displaying. /// /// If [WebView.initialUrl] was never specified, returns `null`. From 059613662751979c7e99ecb6a2f8cc5d4ece9376 Mon Sep 17 00:00:00 2001 From: Rafal Wachol Date: Thu, 21 Nov 2019 12:34:12 +0000 Subject: [PATCH 4/4] reformatted code --- .../webviewflutter/FlutterWebView.java | 15 +++-- .../ios/Classes/FlutterWebView.m | 55 +++++++++---------- .../lib/src/webview_method_channel.dart | 2 +- 3 files changed, 37 insertions(+), 35 deletions(-) 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 6ca6e8f8108a..44ea64e3e90b 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 @@ -9,7 +9,6 @@ import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Handler; -import android.util.Log; import android.view.View; import android.webkit.WebStorage; import android.webkit.WebViewClient; @@ -19,7 +18,6 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.platform.PlatformView; - import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Collections; @@ -127,7 +125,7 @@ public void onMethodCall(MethodCall methodCall, Result result) { loadUrl(methodCall, result); break; case "postUrl": - postUrl(methodCall,result); + postUrl(methodCall, result); break; case "updateSettings": updateSettings(methodCall, result); @@ -170,10 +168,15 @@ public void onMethodCall(MethodCall methodCall, Result result) { } } - private static String initialParametersToString(Map parameters) throws UnsupportedEncodingException { + private static String initialParametersToString(Map parameters) + throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); for (Map.Entry entry : parameters.entrySet()) { - sb.append(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue().toString(), "UTF-8") + "&"); + sb.append( + URLEncoder.encode(entry.getKey(), "UTF-8") + + "=" + + URLEncoder.encode(entry.getValue().toString(), "UTF-8") + + "&"); } return sb.deleteCharAt(sb.length() - 1).toString(); @@ -199,7 +202,7 @@ private void postUrl(MethodCall methodCall, Result result) { byte[] params = (byte[]) request.get("params"); webView.postUrl(url, params); - + result.success(null); } diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 9d46828f5b52..46ec19aec68d 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -3,9 +3,9 @@ // found in the LICENSE file. #import "FlutterWebView.h" +#import #import "FLTWKNavigationDelegate.h" #import "JavaScriptChannelHandler.h" -#import @implementation FLTWebViewFactory { NSObject* _messenger; @@ -78,14 +78,14 @@ - (instancetype)initWithFrame:(CGRect)frame [weakSelf onMethodCall:call result:result]; }]; - [self applySettings:settings]; - // 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]; - } + [self applySettings:settings]; + // 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]; + } } return self; } @@ -343,28 +343,27 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary*) return true; } -- (bool) postUrl:(FlutterMethodCall*)call result:(FlutterResult)result { - NSDictionary* args = [call arguments]; - - NSString* url = (NSString*)args[@"url"]; - NSURL* nsUrl = [NSURL URLWithString:url]; - if (!nsUrl) { - return false; - } +- (bool)postUrl:(FlutterMethodCall*)call result:(FlutterResult)result { + NSDictionary* args = [call arguments]; - NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:nsUrl]; - FlutterStandardTypedData* postData = (FlutterStandardTypedData*)args[@"params"]; - NSString* contentLength = @(postData.data.length).stringValue; - - [request setHTTPMethod:@"POST"]; - [request setHTTPBody:postData.data]; - - [request setValue:contentLength forHTTPHeaderField:@"Content-Length"]; - [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + NSString* url = (NSString*)args[@"url"]; + NSURL* nsUrl = [NSURL URLWithString:url]; + if (!nsUrl) { + return false; + } + + NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:nsUrl]; + FlutterStandardTypedData* postData = (FlutterStandardTypedData*)args[@"params"]; + NSString* contentLength = @(postData.data.length).stringValue; - [_webView loadRequest:request]; - return true; + [request setHTTPMethod:@"POST"]; + [request setHTTPBody:postData.data]; + [request setValue:contentLength forHTTPHeaderField:@"Content-Length"]; + [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + + [_webView loadRequest:request]; + return true; } - (void)registerJavaScriptChannels:(NSSet*)channelNames diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index 8ffc3329ff9d..090d9bd81860 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -60,7 +60,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { Future postUrl(String url, Uint8List params) async { assert(url != null); assert(params != null); - return _channel.invokeMethod('postUrl', { + return _channel.invokeMethod('postUrl', { 'url': url, 'params': params, });