[webview_flutter_platform_interface] Improves error message when `WebViewPlatform.instance` is null (#6938)
* add assertion
* formatting
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
index a4be504..19a7950 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 @@
+## 2.0.1
+
+* Improves error message when a platform interface class is used before `WebViewPlatform.instance` has been set.
+
## 2.0.0
* **Breaking Change**: Releases new interface. See [documentation](https://pub.dev/documentation/webview_flutter_platform_interface/2.0.0/) and [design doc](https://flutter.dev/go/webview_flutter_4_interface)
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart
index 2df6cff..ec7af71 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart
@@ -31,6 +31,13 @@
/// Creates a new [PlatformNavigationDelegate]
factory PlatformNavigationDelegate(
PlatformNavigationDelegateCreationParams params) {
+ assert(
+ WebViewPlatform.instance != null,
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ );
final PlatformNavigationDelegate callbackDelegate =
WebViewPlatform.instance!.createPlatformNavigationDelegate(params);
PlatformInterface.verify(callbackDelegate, _token);
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart
index 7bb259c..bdeaa97 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart
@@ -21,6 +21,13 @@
/// Creates a new [PlatformWebViewController]
factory PlatformWebViewController(
PlatformWebViewControllerCreationParams params) {
+ assert(
+ WebViewPlatform.instance != null,
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ );
final PlatformWebViewController webViewControllerDelegate =
WebViewPlatform.instance!.createPlatformWebViewController(params);
PlatformInterface.verify(webViewControllerDelegate, _token);
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart
index 9e981c9..a674067 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart
@@ -19,6 +19,13 @@
/// Creates a new [PlatformWebViewCookieManager]
factory PlatformWebViewCookieManager(
PlatformWebViewCookieManagerCreationParams params) {
+ assert(
+ WebViewPlatform.instance != null,
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ );
final PlatformWebViewCookieManager cookieManagerDelegate =
WebViewPlatform.instance!.createPlatformCookieManager(params);
PlatformInterface.verify(cookieManagerDelegate, _token);
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart
index 40334c6..2e49c80 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart
@@ -11,6 +11,13 @@
abstract class PlatformWebViewWidget extends PlatformInterface {
/// Creates a new [PlatformWebViewWidget]
factory PlatformWebViewWidget(PlatformWebViewWidgetCreationParams params) {
+ assert(
+ WebViewPlatform.instance != null,
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ );
final PlatformWebViewWidget webViewWidgetDelegate =
WebViewPlatform.instance!.createPlatformWebViewWidget(params);
PlatformInterface.verify(webViewWidgetDelegate, _token);
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
index 3ba7a56..8653072 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: 2.0.0
+version: 2.0.1
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart
index 34f8406..ec24dd7 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_platform_test.dart
@@ -18,6 +18,69 @@
expect(WebViewPlatform.instance, isNull);
});
+ // This test can only run while `WebViewPlatform.instance` is still null.
+ test(
+ 'Interface classes throw assertion error when `WebViewPlatform.instance` is null',
+ () {
+ expect(
+ () => PlatformNavigationDelegate(
+ const PlatformNavigationDelegateCreationParams(),
+ ),
+ throwsA(isA<AssertionError>().having(
+ (AssertionError error) => error.message,
+ 'message',
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ )),
+ );
+
+ expect(
+ () => PlatformWebViewController(
+ const PlatformWebViewControllerCreationParams(),
+ ),
+ throwsA(isA<AssertionError>().having(
+ (AssertionError error) => error.message,
+ 'message',
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ )),
+ );
+
+ expect(
+ () => PlatformWebViewCookieManager(
+ const PlatformWebViewCookieManagerCreationParams(),
+ ),
+ throwsA(isA<AssertionError>().having(
+ (AssertionError error) => error.message,
+ 'message',
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ )),
+ );
+
+ expect(
+ () => PlatformWebViewWidget(
+ PlatformWebViewWidgetCreationParams(
+ controller: MockWebViewControllerDelegate(),
+ ),
+ ),
+ throwsA(isA<AssertionError>().having(
+ (AssertionError error) => error.message,
+ 'message',
+ 'A platform implementation for `webview_flutter` has not been set. Please '
+ 'ensure that an implementation of `WebViewPlatform` has been set to '
+ '`WebViewPlatform.instance` before use. For unit testing, '
+ '`WebViewPlatform.instance` can be set with your own test implementation.',
+ )),
+ );
+ });
+
test('Cannot be implemented with `implements`', () {
expect(() {
WebViewPlatform.instance = ImplementsWebViewPlatform();