From e30e80e19d9fe69a342fdbfb33c9d4b41185191f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Mon, 9 Jan 2023 18:29:14 -0500 Subject: [PATCH] [webview_flutter_platform_interface] Improves error message when `WebViewPlatform.instance` is null (#6938) * add assertion * formatting --- .../CHANGELOG.md | 4 ++ .../lib/src/platform_navigation_delegate.dart | 7 +++ .../lib/src/platform_webview_controller.dart | 7 +++ .../src/platform_webview_cookie_manager.dart | 7 +++ .../lib/src/platform_webview_widget.dart | 7 +++ .../pubspec.yaml | 2 +- .../test/webview_platform_test.dart | 63 +++++++++++++++++++ 7 files changed, 96 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index a4be504f3035..19a7950e45ab 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 2df6cff73ab5..ec7af71eea51 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 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { /// 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 7bb259c274b1..bdeaa977d3dd 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 @@ abstract class PlatformWebViewController extends PlatformInterface { /// 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 9e981c9022c6..a6740670e5c3 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 @@ abstract class PlatformWebViewCookieManager extends PlatformInterface { /// 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 40334c650b3a..2e49c80d0a9c 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 @@ import 'webview_platform.dart'; 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 3ba7a567398e..865307245079 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 @@ repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutte 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 34f84065e951..ec24dd7f5fa2 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 @@ void main() { 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().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().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().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().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();