[webview_flutter] Adds the `loadFlutterAsset` method to the interface. (#4562)
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
index 1b8a1fd..ac61d48 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.8.0
+
+* Adds the `loadFlutterAsset` method to the platform interface.
+
## 1.7.0
* Add an option to set the background color of the webview.
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
index ef1b919..bb2a4ac 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
@@ -84,7 +84,31 @@
@override
Future<void> loadFile(String absoluteFilePath) async {
assert(absoluteFilePath != null);
- return _channel.invokeMethod<void>('loadFile', absoluteFilePath);
+
+ try {
+ return await _channel.invokeMethod<void>('loadFile', absoluteFilePath);
+ } on PlatformException catch (ex) {
+ if (ex.code == 'loadFile_failed') {
+ throw ArgumentError(ex.message);
+ }
+
+ rethrow;
+ }
+ }
+
+ @override
+ Future<void> loadFlutterAsset(String key) async {
+ assert(key.isNotEmpty);
+
+ try {
+ return await _channel.invokeMethod<void>('loadFlutterAsset', key);
+ } on PlatformException catch (ex) {
+ if (ex.code == 'loadFlutterAsset_invalidKey') {
+ throw ArgumentError(ex.message);
+ }
+
+ rethrow;
+ }
}
@override
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
index da73204..3437fe1 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
@@ -37,6 +37,17 @@
String absoluteFilePath,
) {
throw UnimplementedError(
+ 'WebView loadFile is not implemented on the current platform');
+ }
+
+ /// Loads the Flutter asset specified in the pubspec.yaml file.
+ ///
+ /// Throws an ArgumentError if [key] is not part of the specified assets
+ /// in the pubspec.yaml file.
+ Future<void> loadFlutterAsset(
+ String key,
+ ) {
+ throw UnimplementedError(
'WebView loadFlutterAsset is not implemented on the current platform');
}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
index 2bad743..5950cab 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 1.7.0
+version: 1.8.0
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
index 3bcc2fe..5d2c717 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
@@ -33,6 +33,35 @@
case 'canGoBack':
case 'canGoForward':
return true;
+ case 'loadFile':
+ if (methodCall.arguments == 'invalid file') {
+ throw PlatformException(
+ code: 'loadFile_failed',
+ message: 'Failed loading file.',
+ details: null);
+ } else if (methodCall.arguments == 'some error') {
+ throw PlatformException(
+ code: 'some_error',
+ message: 'Some error occurred.',
+ details: null,
+ );
+ }
+ return null;
+ case 'loadFlutterAsset':
+ if (methodCall.arguments == 'invalid key') {
+ throw PlatformException(
+ code: 'loadFlutterAsset_invalidKey',
+ message: 'Failed loading asset.',
+ details: null,
+ );
+ } else if (methodCall.arguments == 'some error') {
+ throw PlatformException(
+ code: 'some_error',
+ message: 'Some error occurred.',
+ details: null,
+ );
+ }
+ return null;
case 'runJavascriptReturningResult':
case 'evaluateJavascript':
return methodCall.arguments as String;
@@ -74,6 +103,78 @@
);
});
+ test('loadFile with invalid file', () async {
+ expect(
+ () => webViewPlatform.loadFile('invalid file'),
+ throwsA(
+ isA<ArgumentError>().having(
+ (ArgumentError error) => error.message,
+ 'message',
+ 'Failed loading file.',
+ ),
+ ),
+ );
+ });
+
+ test('loadFile with some error.', () async {
+ expect(
+ () => webViewPlatform.loadFile('some error'),
+ throwsA(
+ isA<PlatformException>().having(
+ (PlatformException error) => error.message,
+ 'message',
+ 'Some error occurred.',
+ ),
+ ),
+ );
+ });
+
+ test('loadFlutterAsset', () async {
+ await webViewPlatform.loadFlutterAsset(
+ 'folder/asset.html',
+ );
+
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall(
+ 'loadFlutterAsset',
+ arguments: 'folder/asset.html',
+ ),
+ ],
+ );
+ });
+
+ test('loadFlutterAsset with empty key', () async {
+ expect(() => webViewPlatform.loadFlutterAsset(''), throwsAssertionError);
+ });
+
+ test('loadFlutterAsset with invalid key', () async {
+ expect(
+ () => webViewPlatform.loadFlutterAsset('invalid key'),
+ throwsA(
+ isA<ArgumentError>().having(
+ (ArgumentError error) => error.message,
+ 'message',
+ 'Failed loading asset.',
+ ),
+ ),
+ );
+ });
+
+ test('loadFlutterAsset with some error.', () async {
+ expect(
+ () => webViewPlatform.loadFlutterAsset('some error'),
+ throwsA(
+ isA<PlatformException>().having(
+ (PlatformException error) => error.message,
+ 'message',
+ 'Some error occurred.',
+ ),
+ ),
+ );
+ });
+
test('loadHtmlString without base URL', () async {
await webViewPlatform.loadHtmlString(
'Test HTML string',