[webview_flutter] Implements the loadFlutterAsset in the app facing package. (#4593)
diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index 1df7e53..4906003 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@ +## 2.8.0 + +* Adds support for the `loadFlutterAsset` method. + ## 2.7.0 * Adds `setCookie` to CookieManager.
diff --git a/packages/webview_flutter/webview_flutter/example/assets/www/index.html b/packages/webview_flutter/webview_flutter/example/assets/www/index.html new file mode 100644 index 0000000..9895dd3 --- /dev/null +++ b/packages/webview_flutter/webview_flutter/example/assets/www/index.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<!-- Copyright 2013 The Flutter Authors. All rights reserved. +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. --> +<html lang="en"> +<head> +<title>Load file or HTML string example</title> +<link rel="stylesheet" href="styles/style.css" /> +</head> +<body> + +<h1>Local demo page</h1> +<p> + This is an example page used to demonstrate how to load a local file or HTML + string using the <a href="https://pub.dev/packages/webview_flutter">Flutter + webview</a> plugin. +</p> + +</body> +</html> \ No newline at end of file
diff --git a/packages/webview_flutter/webview_flutter/example/assets/www/styles/style.css b/packages/webview_flutter/webview_flutter/example/assets/www/styles/style.css new file mode 100644 index 0000000..c2140b8 --- /dev/null +++ b/packages/webview_flutter/webview_flutter/example/assets/www/styles/style.css
@@ -0,0 +1,3 @@ +h1 { + color: blue; +} \ No newline at end of file
diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart index 65786de..88c240a 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart
@@ -179,6 +179,7 @@ navigationDelegate, doPostRequest, loadLocalFile, + loadFlutterAsset, loadHtmlString, transparentBackground, setCookie, @@ -227,6 +228,9 @@ case MenuOptions.loadLocalFile: _onLoadLocalFileExample(controller.data!, context); break; + case MenuOptions.loadFlutterAsset: + _onLoadFlutterAssetExample(controller.data!, context); + break; case MenuOptions.loadHtmlString: _onLoadHtmlStringExample(controller.data!, context); break; @@ -281,6 +285,10 @@ child: Text('Load local file'), ), const PopupMenuItem<MenuOptions>( + value: MenuOptions.loadFlutterAsset, + child: Text('Load Flutter Asset'), + ), + const PopupMenuItem<MenuOptions>( key: ValueKey<String>('ShowTransparentBackgroundExample'), value: MenuOptions.transparentBackground, child: Text('Transparent background example'), @@ -392,6 +400,11 @@ await controller.loadFile(pathToIndex); } + Future<void> _onLoadFlutterAssetExample( + WebViewController controller, BuildContext context) async { + await controller.loadFlutterAsset('assets/www/index.html'); + } + Future<void> _onLoadHtmlStringExample( WebViewController controller, BuildContext context) async { await controller.loadHtmlString(kLocalExamplePage);
diff --git a/packages/webview_flutter/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/webview_flutter/example/pubspec.yaml index 284a7a9..ae3b57e 100644 --- a/packages/webview_flutter/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/example/pubspec.yaml
@@ -33,3 +33,5 @@ assets: - assets/sample_audio.ogg - assets/sample_video.mp4 + - assets/www/index.html + - assets/www/styles/style.css
diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index 8fe4f41..7b907a5 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart
@@ -526,6 +526,15 @@ return _webViewPlatformController.loadFile(absoluteFilePath); } + /// 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) { + assert(key.isNotEmpty); + return _webViewPlatformController.loadFlutterAsset(key); + } + /// Loads the supplied HTML string. /// /// The [baseUrl] parameter is used when resolving relative URLs within the
diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index cd6c618..4ac5e1d 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml
@@ -2,7 +2,7 @@ description: A Flutter plugin that provides a WebView widget on Android and iOS. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.7.0 +version: 2.8.0 environment: sdk: ">=2.14.0 <3.0.0" @@ -21,7 +21,7 @@ sdk: flutter webview_flutter_android: ^2.8.0 webview_flutter_platform_interface: ^1.8.0 - webview_flutter_wkwebview: ^2.6.0 + webview_flutter_wkwebview: ^2.7.0 dev_dependencies: build_runner: ^2.1.5
diff --git a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart index 40baef7..ad25cad 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart
@@ -131,6 +131,40 @@ expect(() => controller!.loadFile(''), throwsAssertionError); }); + testWidgets('Load Flutter asset', (WidgetTester tester) async { + WebViewController? controller; + await tester.pumpWidget( + WebView( + onWebViewCreated: (WebViewController webViewController) { + controller = webViewController; + }, + ), + ); + + expect(controller, isNotNull); + + await controller!.loadFlutterAsset('assets/index.html'); + + verify(mockWebViewPlatformController.loadFlutterAsset( + 'assets/index.html', + )); + }); + + testWidgets('Load Flutter asset with empty key', (WidgetTester tester) async { + WebViewController? controller; + await tester.pumpWidget( + WebView( + onWebViewCreated: (WebViewController webViewController) { + controller = webViewController; + }, + ), + ); + + expect(controller, isNotNull); + + expect(() => controller!.loadFlutterAsset(''), throwsAssertionError); + }); + testWidgets('Load HTML string without base URL', (WidgetTester tester) async { WebViewController? controller; await tester.pumpWidget(