Fix bugs in Dart Implementation of the Pigeon API  (#4461)

diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart
index 1ddd6f3..f6faa8e 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart
@@ -29,6 +29,8 @@
 /// To learn more about WebView and alternatives for serving web content, read
 /// the documentation on
 /// [Web-based content](https://developer.android.com/guide/webapps).
+///
+/// When a [WebView] is no longer needed [release] must be called.
 class WebView {
   /// Constructs a new WebView.
   WebView({this.useHybridComposition = false}) {
@@ -40,9 +42,6 @@
   static WebViewHostApiImpl api = WebViewHostApiImpl();
 
   WebViewClient? _currentWebViewClient;
-  DownloadListener? _currentDownloadListener;
-  WebChromeClient? _currentWebChromeClient;
-  Set<JavaScriptChannel> _javaScriptChannels = <JavaScriptChannel>{};
 
   /// Whether the [WebView] will be rendered with an [AndroidViewSurface].
   ///
@@ -187,18 +186,8 @@
   ///
   /// This will replace the current handler.
   Future<void> setWebViewClient(WebViewClient webViewClient) {
-    final WebViewClient? currentWebViewClient = _currentWebViewClient;
-
-    if (webViewClient == currentWebViewClient) {
-      return Future<void>.value();
-    }
-
-    if (currentWebViewClient != null) {
-      WebViewClient.api.disposeFromInstance(currentWebViewClient);
-    }
-
-    WebViewClient.api.createFromInstance(webViewClient);
     _currentWebViewClient = webViewClient;
+    WebViewClient.api.createFromInstance(webViewClient);
     return api.setWebViewClientFromInstance(this, webViewClient);
   }
 
@@ -227,7 +216,6 @@
   /// content is ever loaded into the WebView even inside an iframe.
   Future<void> addJavaScriptChannel(JavaScriptChannel javaScriptChannel) {
     JavaScriptChannel.api.createFromInstance(javaScriptChannel);
-    _javaScriptChannels.add(javaScriptChannel);
     return api.addJavaScriptChannelFromInstance(this, javaScriptChannel);
   }
 
@@ -236,27 +224,15 @@
   /// Note that the removal will not be reflected in JavaScript until the page
   /// is next (re)loaded. See [addJavaScriptChannel].
   Future<void> removeJavaScriptChannel(JavaScriptChannel javaScriptChannel) {
-    _javaScriptChannels.remove(javaScriptChannel);
-    api.removeJavaScriptChannelFromInstance(this, javaScriptChannel);
-    return JavaScriptChannel.api.disposeFromInstance(javaScriptChannel);
+    JavaScriptChannel.api.createFromInstance(javaScriptChannel);
+    return api.removeJavaScriptChannelFromInstance(this, javaScriptChannel);
   }
 
   /// Registers the interface to be used when content can not be handled by the rendering engine, and should be downloaded instead.
   ///
   /// This will replace the current handler.
   Future<void> setDownloadListener(DownloadListener listener) {
-    final DownloadListener? currentDownloadListener = _currentDownloadListener;
-
-    if (listener == currentDownloadListener) {
-      return Future<void>.value();
-    }
-
-    if (currentDownloadListener != null) {
-      DownloadListener.api.disposeFromInstance(currentDownloadListener);
-    }
-
     DownloadListener.api.createFromInstance(listener);
-    _currentDownloadListener = listener;
     return api.setDownloadListenerFromInstance(this, listener);
   }
 
@@ -266,26 +242,26 @@
   /// JavaScript dialogs, favicons, titles, and the progress. This will replace
   /// the current handler.
   Future<void> setWebChromeClient(WebChromeClient client) {
-    final WebChromeClient? currentWebChromeClient = _currentWebChromeClient;
-
-    if (client == currentWebChromeClient) {
-      return Future<void>.value();
-    }
-
-    if (currentWebChromeClient != null) {
-      WebChromeClient.api.disposeFromInstance(currentWebChromeClient);
-    }
-
-    final WebViewClient? currentWebViewClient = _currentWebViewClient;
+    // WebView requires a WebViewClient because of a bug fix that makes
+    // calls to WebViewClient.requestLoading/WebViewClient.urlLoading when a new
+    // window is opened. This is to make sure a url opened by `Window.open` has
+    // a secure url.
     assert(
-      currentWebViewClient != null,
+      _currentWebViewClient != null,
       "Can't set a WebChromeClient without setting a WebViewClient first.",
     );
-
-    WebChromeClient.api.createFromInstance(client, currentWebViewClient!);
-    _currentWebChromeClient = client;
+    WebChromeClient.api.createFromInstance(client, _currentWebViewClient!);
     return api.setWebChromeClientFromInstance(this, client);
   }
+
+  /// Releases all resources used by the [WebView].
+  ///
+  /// Any methods called after [release] will throw an exception.
+  Future<void> release() {
+    _currentWebViewClient = null;
+    WebSettings.api.disposeFromInstance(settings);
+    return api.disposeFromInstance(this);
+  }
 }
 
 /// Manages settings state for a [WebView].
@@ -332,7 +308,7 @@
   ///
   /// The default is false.
   Future<void> setSupportMultipleWindows(bool support) {
-    return api.setSupportZoomFromInstance(this, support);
+    return api.setSupportMultipleWindowsFromInstance(this, support);
   }
 
   /// Tells the WebView to enable JavaScript execution.
@@ -423,7 +399,9 @@
 /// See [WebView.addJavaScriptChannel].
 abstract class JavaScriptChannel {
   /// Constructs a [JavaScriptChannel].
-  JavaScriptChannel(this.channelName);
+  JavaScriptChannel(this.channelName) {
+    AndroidWebViewFlutterApis.instance.ensureSetUp();
+  }
 
   /// Pigeon Host Api implementation for [JavaScriptChannel].
   @visibleForTesting
@@ -433,61 +411,95 @@
   final String channelName;
 
   /// Callback method when javaScript calls `postMessage` on the object instance passed.
-  void postMessage(String message) {}
+  void postMessage(String message);
 }
 
 /// Receive various notifications and requests for [WebView].
 abstract class WebViewClient {
   /// Constructs a [WebViewClient].
-  WebViewClient({this.shouldOverrideUrlLoading = true});
+  WebViewClient({this.shouldOverrideUrlLoading = true}) {
+    AndroidWebViewFlutterApis.instance.ensureSetUp();
+  }
 
   /// User authentication failed on server.
-  static const int errorAuthentication = 0xfffffffc;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_AUTHENTICATION
+  static const int errorAuthentication = -4;
 
   /// Malformed URL.
-  static const int errorBadUrl = 0xfffffff4;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_BAD_URL
+  static const int errorBadUrl = -12;
 
   /// Failed to connect to the server.
-  static const int errorConnect = 0xfffffffa;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_CONNECT
+  static const int errorConnect = -6;
 
   /// Failed to perform SSL handshake.
-  static const int errorFailedSslHandshake = 0xfffffff5;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_FAILED_SSL_HANDSHAKE
+  static const int errorFailedSslHandshake = -11;
 
   /// Generic file error.
-  static const int errorFile = 0xfffffff3;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_FILE
+  static const int errorFile = -13;
 
   /// File not found.
-  static const int errorFileNotFound = 0xfffffff2;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_FILE_NOT_FOUND
+  static const int errorFileNotFound = -14;
 
   /// Server or proxy hostname lookup failed.
-  static const int errorHostLookup = 0xfffffffe;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_HOST_LOOKUP
+  static const int errorHostLookup = -2;
 
   /// Failed to read or write to the server.
-  static const int errorIO = 0xfffffff9;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_IO
+  static const int errorIO = -7;
 
   /// User authentication failed on proxy.
-  static const int errorProxyAuthentication = 0xfffffffb;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_PROXY_AUTHENTICATION
+  static const int errorProxyAuthentication = -5;
 
   /// Too many redirects.
-  static const int errorRedirectLoop = 0xfffffff7;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_REDIRECT_LOOP
+  static const int errorRedirectLoop = -9;
 
   /// Connection timed out.
-  static const int errorTimeout = 0xfffffff8;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_TIMEOUT
+  static const int errorTimeout = -8;
 
   /// Too many requests during this load.
-  static const int errorTooManyRequests = 0xfffffff1;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_TOO_MANY_REQUESTS
+  static const int errorTooManyRequests = -15;
 
   /// Generic error.
-  static const int errorUnknown = 0xffffffff;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNKNOWN
+  static const int errorUnknown = -1;
 
   /// Resource load was canceled by Safe Browsing.
-  static const int errorUnsafeResource = 0xfffffff0;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSAFE_RESOURCE
+  static const int errorUnsafeResource = -16;
 
   /// Unsupported authentication scheme (not basic or digest).
-  static const int errorUnsupportedAuthScheme = 0xfffffffd;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSUPPORTED_AUTH_SCHEME
+  static const int errorUnsupportedAuthScheme = -3;
 
   /// Unsupported URI scheme.
-  static const int errorUnsupportedScheme = 0xfffffff6;
+  ///
+  /// See https://developer.android.com/reference/android/webkit/WebViewClient#ERROR_UNSUPPORTED_SCHEME
+  static const int errorUnsupportedScheme = -10;
 
   /// Pigeon Host Api implementation for [WebViewClient].
   @visibleForTesting
@@ -573,6 +585,11 @@
 
 /// The interface to be used when content can not be handled by the rendering engine for [WebView], and should be downloaded instead.
 abstract class DownloadListener {
+  /// Constructs a [DownloadListener].
+  DownloadListener() {
+    AndroidWebViewFlutterApis.instance.ensureSetUp();
+  }
+
   /// Pigeon Host Api implementation for [DownloadListener].
   @visibleForTesting
   static DownloadListenerHostApiImpl api = DownloadListenerHostApiImpl();
@@ -589,12 +606,17 @@
 
 /// Handles JavaScript dialogs, favicons, titles, and the progress for [WebView].
 abstract class WebChromeClient {
+  /// Constructs a [WebChromeClient].
+  WebChromeClient() {
+    AndroidWebViewFlutterApis.instance.ensureSetUp();
+  }
+
   /// Pigeon Host Api implementation for [WebChromeClient].
   @visibleForTesting
   static WebChromeClientHostApiImpl api = WebChromeClientHostApiImpl();
 
   /// Notify the host application that a file should be downloaded.
-  void onProgressChanged(WebView webView, int progress);
+  void onProgressChanged(WebView webView, int progress) {}
 }
 
 /// Encompasses parameters to the [WebViewClient.requestLoading] method.
@@ -609,24 +631,24 @@
     required this.requestHeaders,
   });
 
-  /// Gets the URL for which the resource request was made.
+  /// The URL for which the resource request was made.
   final String url;
 
-  /// Gets whether the request was made in order to fetch the main frame's document.
-  final isForMainFrame;
+  /// Whether the request was made in order to fetch the main frame's document.
+  final bool isForMainFrame;
 
-  /// Gets whether the request was a result of a server-side redirect.
+  /// Whether the request was a result of a server-side redirect.
   ///
   /// Only supported on Android version >= 24.
   final bool? isRedirect;
 
-  /// Gets whether a gesture (such as a click) was associated with the request.
+  /// Whether a gesture (such as a click) was associated with the request.
   final bool hasGesture;
 
-  /// Gets the method associated with the request, for example "GET".
+  /// The method associated with the request, for example "GET".
   final String method;
 
-  /// Gets the headers associated with the request.
+  /// The headers associated with the request.
   final Map<String, String> requestHeaders;
 }
 
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart
index 81ec7c7..7fb95f1 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Autogenerated from Pigeon (v1.0.7), do not edit directly.
+// Autogenerated from Pigeon (v1.0.9), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name
 // @dart = 2.12
@@ -1039,31 +1039,6 @@
       return;
     }
   }
-
-  Future<void> dispose(int arg_instanceId) async {
-    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.JavaScriptChannelHostApi.dispose', codec,
-        binaryMessenger: _binaryMessenger);
-    final Map<Object?, Object?>? replyMap =
-        await channel.send(<Object>[arg_instanceId]) as Map<Object?, Object?>?;
-    if (replyMap == null) {
-      throw PlatformException(
-        code: 'channel-error',
-        message: 'Unable to establish connection on channel.',
-        details: null,
-      );
-    } else if (replyMap['error'] != null) {
-      final Map<Object?, Object?> error =
-          (replyMap['error'] as Map<Object?, Object?>?)!;
-      throw PlatformException(
-        code: (error['code'] as String?)!,
-        message: error['message'] as String?,
-        details: error['details'],
-      );
-    } else {
-      return;
-    }
-  }
 }
 
 class _JavaScriptChannelFlutterApiCodec extends StandardMessageCodec {
@@ -1074,11 +1049,33 @@
   static const MessageCodec<Object?> codec =
       _JavaScriptChannelFlutterApiCodec();
 
+  void dispose(int instanceId);
   void postMessage(int instanceId, String message);
-  static void setup(JavaScriptChannelFlutterApi? api) {
+  static void setup(JavaScriptChannelFlutterApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMessageHandler(null);
+      } else {
+        channel.setMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose was null.');
+          final List<Object?> args = (message as List<Object?>?)!;
+          final int? arg_instanceId = (args[0] as int?);
+          assert(arg_instanceId != null,
+              'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.dispose was null, expected non-null int.');
+          api.dispose(arg_instanceId!);
+          return;
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1086,10 +1083,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage was null, expected non-null int.');
-          final String? arg_message = args[1] as String?;
+          final String? arg_message = (args[1] as String?);
           assert(arg_message != null,
               'Argument for dev.flutter.pigeon.JavaScriptChannelFlutterApi.postMessage was null, expected non-null String.');
           api.postMessage(arg_instanceId!, arg_message!);
@@ -1141,31 +1138,6 @@
       return;
     }
   }
-
-  Future<void> dispose(int arg_instanceId) async {
-    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.WebViewClientHostApi.dispose', codec,
-        binaryMessenger: _binaryMessenger);
-    final Map<Object?, Object?>? replyMap =
-        await channel.send(<Object>[arg_instanceId]) as Map<Object?, Object?>?;
-    if (replyMap == null) {
-      throw PlatformException(
-        code: 'channel-error',
-        message: 'Unable to establish connection on channel.',
-        details: null,
-      );
-    } else if (replyMap['error'] != null) {
-      final Map<Object?, Object?> error =
-          (replyMap['error'] as Map<Object?, Object?>?)!;
-      throw PlatformException(
-        code: (error['code'] as String?)!,
-        message: error['message'] as String?,
-        details: error['details'],
-      );
-    } else {
-      return;
-    }
-  }
 }
 
 class _WebViewClientFlutterApiCodec extends StandardMessageCodec {
@@ -1178,9 +1150,6 @@
     } else if (value is WebResourceRequestData) {
       buffer.putUint8(129);
       writeValue(buffer, value.encode());
-    } else if (value is WebResourceRequestData) {
-      buffer.putUint8(130);
-      writeValue(buffer, value.encode());
     } else {
       super.writeValue(buffer, value);
     }
@@ -1195,9 +1164,6 @@
       case 129:
         return WebResourceRequestData.decode(readValue(buffer)!);
 
-      case 130:
-        return WebResourceRequestData.decode(readValue(buffer)!);
-
       default:
         return super.readValueOfType(type, buffer);
     }
@@ -1207,6 +1173,7 @@
 abstract class WebViewClientFlutterApi {
   static const MessageCodec<Object?> codec = _WebViewClientFlutterApiCodec();
 
+  void dispose(int instanceId);
   void onPageStarted(int instanceId, int webViewInstanceId, String url);
   void onPageFinished(int instanceId, int webViewInstanceId, String url);
   void onReceivedRequestError(int instanceId, int webViewInstanceId,
@@ -1216,10 +1183,31 @@
   void requestLoading(
       int instanceId, int webViewInstanceId, WebResourceRequestData request);
   void urlLoading(int instanceId, int webViewInstanceId, String url);
-  static void setup(WebViewClientFlutterApi? api) {
+  static void setup(WebViewClientFlutterApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientFlutterApi.dispose', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMessageHandler(null);
+      } else {
+        channel.setMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.dispose was null.');
+          final List<Object?> args = (message as List<Object?>?)!;
+          final int? arg_instanceId = (args[0] as int?);
+          assert(arg_instanceId != null,
+              'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.dispose was null, expected non-null int.');
+          api.dispose(arg_instanceId!);
+          return;
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1227,13 +1215,13 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null, expected non-null int.');
-          final String? arg_url = args[2] as String?;
+          final String? arg_url = (args[2] as String?);
           assert(arg_url != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageStarted was null, expected non-null String.');
           api.onPageStarted(arg_instanceId!, arg_webViewInstanceId!, arg_url!);
@@ -1242,8 +1230,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1251,13 +1240,13 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null, expected non-null int.');
-          final String? arg_url = args[2] as String?;
+          final String? arg_url = (args[2] as String?);
           assert(arg_url != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onPageFinished was null, expected non-null String.');
           api.onPageFinished(arg_instanceId!, arg_webViewInstanceId!, arg_url!);
@@ -1266,9 +1255,10 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1276,18 +1266,18 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null int.');
           final WebResourceRequestData? arg_request =
-              args[2] as WebResourceRequestData?;
+              (args[2] as WebResourceRequestData?);
           assert(arg_request != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null WebResourceRequestData.');
           final WebResourceErrorData? arg_error =
-              args[3] as WebResourceErrorData?;
+              (args[3] as WebResourceErrorData?);
           assert(arg_error != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError was null, expected non-null WebResourceErrorData.');
           api.onReceivedRequestError(arg_instanceId!, arg_webViewInstanceId!,
@@ -1297,8 +1287,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1306,19 +1297,19 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null int.');
-          final int? arg_errorCode = args[2] as int?;
+          final int? arg_errorCode = (args[2] as int?);
           assert(arg_errorCode != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null int.');
-          final String? arg_description = args[3] as String?;
+          final String? arg_description = (args[3] as String?);
           assert(arg_description != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null String.');
-          final String? arg_failingUrl = args[4] as String?;
+          final String? arg_failingUrl = (args[4] as String?);
           assert(arg_failingUrl != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedError was null, expected non-null String.');
           api.onReceivedError(arg_instanceId!, arg_webViewInstanceId!,
@@ -1328,8 +1319,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1337,14 +1329,14 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null, expected non-null int.');
           final WebResourceRequestData? arg_request =
-              args[2] as WebResourceRequestData?;
+              (args[2] as WebResourceRequestData?);
           assert(arg_request != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.requestLoading was null, expected non-null WebResourceRequestData.');
           api.requestLoading(
@@ -1354,8 +1346,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1363,13 +1356,13 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null, expected non-null int.');
-          final String? arg_url = args[2] as String?;
+          final String? arg_url = (args[2] as String?);
           assert(arg_url != null,
               'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading was null, expected non-null String.');
           api.urlLoading(arg_instanceId!, arg_webViewInstanceId!, arg_url!);
@@ -1419,31 +1412,6 @@
       return;
     }
   }
-
-  Future<void> dispose(int arg_instanceId) async {
-    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.DownloadListenerHostApi.dispose', codec,
-        binaryMessenger: _binaryMessenger);
-    final Map<Object?, Object?>? replyMap =
-        await channel.send(<Object>[arg_instanceId]) as Map<Object?, Object?>?;
-    if (replyMap == null) {
-      throw PlatformException(
-        code: 'channel-error',
-        message: 'Unable to establish connection on channel.',
-        details: null,
-      );
-    } else if (replyMap['error'] != null) {
-      final Map<Object?, Object?> error =
-          (replyMap['error'] as Map<Object?, Object?>?)!;
-      throw PlatformException(
-        code: (error['code'] as String?)!,
-        message: error['message'] as String?,
-        details: error['details'],
-      );
-    } else {
-      return;
-    }
-  }
 }
 
 class _DownloadListenerFlutterApiCodec extends StandardMessageCodec {
@@ -1453,13 +1421,35 @@
 abstract class DownloadListenerFlutterApi {
   static const MessageCodec<Object?> codec = _DownloadListenerFlutterApiCodec();
 
+  void dispose(int instanceId);
   void onDownloadStart(int instanceId, String url, String userAgent,
       String contentDisposition, String mimetype, int contentLength);
-  static void setup(DownloadListenerFlutterApi? api) {
+  static void setup(DownloadListenerFlutterApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.DownloadListenerFlutterApi.dispose', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMessageHandler(null);
+      } else {
+        channel.setMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.dispose was null.');
+          final List<Object?> args = (message as List<Object?>?)!;
+          final int? arg_instanceId = (args[0] as int?);
+          assert(arg_instanceId != null,
+              'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.dispose was null, expected non-null int.');
+          api.dispose(arg_instanceId!);
+          return;
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1467,22 +1457,22 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null int.');
-          final String? arg_url = args[1] as String?;
+          final String? arg_url = (args[1] as String?);
           assert(arg_url != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.');
-          final String? arg_userAgent = args[2] as String?;
+          final String? arg_userAgent = (args[2] as String?);
           assert(arg_userAgent != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.');
-          final String? arg_contentDisposition = args[3] as String?;
+          final String? arg_contentDisposition = (args[3] as String?);
           assert(arg_contentDisposition != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.');
-          final String? arg_mimetype = args[4] as String?;
+          final String? arg_mimetype = (args[4] as String?);
           assert(arg_mimetype != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null String.');
-          final int? arg_contentLength = args[5] as int?;
+          final int? arg_contentLength = (args[5] as int?);
           assert(arg_contentLength != null,
               'Argument for dev.flutter.pigeon.DownloadListenerFlutterApi.onDownloadStart was null, expected non-null int.');
           api.onDownloadStart(arg_instanceId!, arg_url!, arg_userAgent!,
@@ -1535,31 +1525,6 @@
       return;
     }
   }
-
-  Future<void> dispose(int arg_instanceId) async {
-    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.WebChromeClientHostApi.dispose', codec,
-        binaryMessenger: _binaryMessenger);
-    final Map<Object?, Object?>? replyMap =
-        await channel.send(<Object>[arg_instanceId]) as Map<Object?, Object?>?;
-    if (replyMap == null) {
-      throw PlatformException(
-        code: 'channel-error',
-        message: 'Unable to establish connection on channel.',
-        details: null,
-      );
-    } else if (replyMap['error'] != null) {
-      final Map<Object?, Object?> error =
-          (replyMap['error'] as Map<Object?, Object?>?)!;
-      throw PlatformException(
-        code: (error['code'] as String?)!,
-        message: error['message'] as String?,
-        details: error['details'],
-      );
-    } else {
-      return;
-    }
-  }
 }
 
 class _WebChromeClientFlutterApiCodec extends StandardMessageCodec {
@@ -1569,12 +1534,34 @@
 abstract class WebChromeClientFlutterApi {
   static const MessageCodec<Object?> codec = _WebChromeClientFlutterApiCodec();
 
+  void dispose(int instanceId);
   void onProgressChanged(int instanceId, int webViewInstanceId, int progress);
-  static void setup(WebChromeClientFlutterApi? api) {
+  static void setup(WebChromeClientFlutterApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebChromeClientFlutterApi.dispose', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMessageHandler(null);
+      } else {
+        channel.setMessageHandler((Object? message) async {
+          assert(message != null,
+              'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.dispose was null.');
+          final List<Object?> args = (message as List<Object?>?)!;
+          final int? arg_instanceId = (args[0] as int?);
+          assert(arg_instanceId != null,
+              'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.dispose was null, expected non-null int.');
+          api.dispose(arg_instanceId!);
+          return;
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -1582,13 +1569,13 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null, expected non-null int.');
-          final int? arg_progress = args[2] as int?;
+          final int? arg_progress = (args[2] as int?);
           assert(arg_progress != null,
               'Argument for dev.flutter.pigeon.WebChromeClientFlutterApi.onProgressChanged was null, expected non-null int.');
           api.onProgressChanged(
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart
index f909e49..fba0dea 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart
@@ -8,6 +8,77 @@
 import 'android_webview.pigeon.dart';
 import 'instance_manager.dart';
 
+/// Converts [WebResourceRequestData] to [WebResourceRequest]
+WebResourceRequest _toWebResourceRequest(WebResourceRequestData data) {
+  return WebResourceRequest(
+    url: data.url!,
+    isForMainFrame: data.isForMainFrame!,
+    isRedirect: data.isRedirect,
+    hasGesture: data.hasGesture!,
+    method: data.method!,
+    requestHeaders:
+        data.requestHeaders?.cast<String, String>() ?? <String, String>{},
+  );
+}
+
+/// Converts [WebResourceErrorData] to [WebResourceError].
+WebResourceError _toWebResourceError(WebResourceErrorData data) {
+  return WebResourceError(
+    errorCode: data.errorCode!,
+    description: data.description!,
+  );
+}
+
+/// Handles initialization of Flutter APIs for Android WebView.
+class AndroidWebViewFlutterApis {
+  /// Creates a [AndroidWebViewFlutterApis].
+  AndroidWebViewFlutterApis({
+    DownloadListenerFlutterApiImpl? downloadListenerFlutterApi,
+    WebViewClientFlutterApiImpl? webViewClientFlutterApi,
+    WebChromeClientFlutterApiImpl? webChromeClientFlutterApi,
+    JavaScriptChannelFlutterApiImpl? javaScriptChannelFlutterApi,
+  }) {
+    this.downloadListenerFlutterApi =
+        downloadListenerFlutterApi ?? DownloadListenerFlutterApiImpl();
+    this.webViewClientFlutterApi =
+        webViewClientFlutterApi ?? WebViewClientFlutterApiImpl();
+    this.webChromeClientFlutterApi =
+        webChromeClientFlutterApi ?? WebChromeClientFlutterApiImpl();
+    this.javaScriptChannelFlutterApi =
+        javaScriptChannelFlutterApi ?? JavaScriptChannelFlutterApiImpl();
+  }
+
+  static bool _haveBeenSetUp = false;
+
+  /// Mutable instance containing all Flutter Apis for Android WebView.
+  ///
+  /// This should only be changed for testing purposes.
+  static AndroidWebViewFlutterApis instance = AndroidWebViewFlutterApis();
+
+  /// Flutter Api for [DownloadListener].
+  late final DownloadListenerFlutterApiImpl downloadListenerFlutterApi;
+
+  /// Flutter Api for [WebViewClient].
+  late final WebViewClientFlutterApiImpl webViewClientFlutterApi;
+
+  /// Flutter Api for [WebChromeClient].
+  late final WebChromeClientFlutterApiImpl webChromeClientFlutterApi;
+
+  /// Flutter Api for [JavaScriptChannel].
+  late final JavaScriptChannelFlutterApiImpl javaScriptChannelFlutterApi;
+
+  /// Ensures all the Flutter APIs have been setup to receive calls from native code.
+  void ensureSetUp() {
+    if (!_haveBeenSetUp) {
+      DownloadListenerFlutterApi.setup(downloadListenerFlutterApi);
+      WebViewClientFlutterApi.setup(webViewClientFlutterApi);
+      WebChromeClientFlutterApi.setup(webChromeClientFlutterApi);
+      JavaScriptChannelFlutterApi.setup(javaScriptChannelFlutterApi);
+      _haveBeenSetUp = true;
+    }
+  }
+}
+
 /// Host api implementation for [WebView].
 class WebViewHostApiImpl extends WebViewHostApi {
   /// Constructs a [WebViewHostApiImpl].
@@ -31,10 +102,11 @@
 
   /// Helper method to convert instances ids to objects.
   Future<void> disposeFromInstance(WebView instance) async {
-    final int? instanceId = instanceManager.removeInstance(instance);
+    final int? instanceId = instanceManager.getInstanceId(instance);
     if (instanceId != null) {
-      return dispose(instanceId);
+      await dispose(instanceId);
     }
+    instanceManager.removeInstance(instance);
   }
 
   /// Helper method to convert instances ids to objects.
@@ -239,7 +311,7 @@
     WebSettings instance,
     bool flag,
   ) {
-    return setJavaScriptCanOpenWindowsAutomatically(
+    return setJavaScriptEnabled(
       instanceManager.getInstanceId(instance)!,
       flag,
     );
@@ -337,20 +409,12 @@
       return create(instanceId, instance.channelName);
     }
   }
-
-  /// Helper method to convert instances ids to objects.
-  Future<void> disposeFromInstance(JavaScriptChannel instance) async {
-    final int? instanceId = instanceManager.removeInstance(instance);
-    if (instanceId != null) {
-      return dispose(instanceId);
-    }
-  }
 }
 
 /// Flutter api implementation for [JavaScriptChannel].
 class JavaScriptChannelFlutterApiImpl extends JavaScriptChannelFlutterApi {
   /// Constructs a [JavaScriptChannelFlutterApiImpl].
-  JavaScriptChannelHostApiImpl({InstanceManager? instanceManager}) {
+  JavaScriptChannelFlutterApiImpl({InstanceManager? instanceManager}) {
     this.instanceManager = instanceManager ?? InstanceManager.instance;
   }
 
@@ -358,6 +422,11 @@
   late final InstanceManager instanceManager;
 
   @override
+  void dispose(int instanceId) {
+    instanceManager.removeInstance(instanceId);
+  }
+
+  @override
   void postMessage(int instanceId, String message) {
     final JavaScriptChannel instance =
         instanceManager.getInstance(instanceId) as JavaScriptChannel;
@@ -385,14 +454,6 @@
       return create(instanceId, instance.shouldOverrideUrlLoading);
     }
   }
-
-  /// Helper method to convert instances ids to objects.
-  Future<void> disposeFromInstance(WebViewClient instance) async {
-    final int? instanceId = instanceManager.removeInstance(instance);
-    if (instanceId != null) {
-      return dispose(instanceId);
-    }
-  }
 }
 
 /// Flutter api implementation for [WebViewClient].
@@ -406,6 +467,11 @@
   late final InstanceManager instanceManager;
 
   @override
+  void dispose(int instanceId) {
+    instanceManager.removeInstance(instanceId);
+  }
+
+  @override
   void onPageFinished(int instanceId, int webViewInstanceId, String url) {
     final WebViewClient instance =
         instanceManager.getInstance(instanceId) as WebViewClient;
@@ -455,18 +521,8 @@
         instanceManager.getInstance(instanceId) as WebViewClient;
     instance.onReceivedRequestError(
       instanceManager.getInstance(webViewInstanceId) as WebView,
-      WebResourceRequest(
-        url: request.url!,
-        isForMainFrame: request.isForMainFrame!,
-        isRedirect: request.isRedirect,
-        hasGesture: request.hasGesture!,
-        method: request.method!,
-        requestHeaders: request.requestHeaders!.cast<String, String>(),
-      ),
-      WebResourceError(
-        errorCode: error.errorCode!,
-        description: error.description!,
-      ),
+      _toWebResourceRequest(request),
+      _toWebResourceError(error),
     );
   }
 
@@ -480,14 +536,7 @@
         instanceManager.getInstance(instanceId) as WebViewClient;
     instance.requestLoading(
       instanceManager.getInstance(webViewInstanceId) as WebView,
-      WebResourceRequest(
-        url: request.url!,
-        isForMainFrame: request.isForMainFrame!,
-        isRedirect: request.isRedirect,
-        hasGesture: request.hasGesture!,
-        method: request.method!,
-        requestHeaders: request.requestHeaders!.cast<String, String>(),
-      ),
+      _toWebResourceRequest(request),
     );
   }
 
@@ -526,14 +575,6 @@
       return create(instanceId);
     }
   }
-
-  /// Helper method to convert instances ids to objects.
-  Future<void> disposeFromInstance(DownloadListener instance) async {
-    final int? instanceId = instanceManager.removeInstance(instance);
-    if (instanceId != null) {
-      return dispose(instanceId);
-    }
-  }
 }
 
 /// Flutter api implementation for [DownloadListener].
@@ -547,6 +588,11 @@
   late final InstanceManager instanceManager;
 
   @override
+  void dispose(int instanceId) {
+    instanceManager.removeInstance(instanceId);
+  }
+
+  @override
   void onDownloadStart(
     int instanceId,
     String url,
@@ -590,14 +636,6 @@
       return create(instanceId, instanceManager.getInstanceId(webViewClient)!);
     }
   }
-
-  /// Helper method to convert instances ids to objects.
-  Future<void> disposeFromInstance(WebChromeClient instance) async {
-    final int? instanceId = instanceManager.removeInstance(instance);
-    if (instanceId != null) {
-      return dispose(instanceId);
-    }
-  }
 }
 
 /// Flutter api implementation for [DownloadListener].
@@ -611,6 +649,11 @@
   late final InstanceManager instanceManager;
 
   @override
+  void dispose(int instanceId) {
+    instanceManager.removeInstance(instanceId);
+  }
+
+  @override
   void onProgressChanged(int instanceId, int webViewInstanceId, int progress) {
     final WebChromeClient instance =
         instanceManager.getInstance(instanceId) as WebChromeClient;
diff --git a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart
index 1877c1b..47bc420 100644
--- a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart
+++ b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart
@@ -105,24 +105,24 @@
 @HostApi(dartHostTestHandler: 'TestJavaScriptChannelHostApi')
 abstract class JavaScriptChannelHostApi {
   void create(int instanceId, String channelName);
-
-  void dispose(int instanceId);
 }
 
 @FlutterApi()
 abstract class JavaScriptChannelFlutterApi {
+  void dispose(int instanceId);
+
   void postMessage(int instanceId, String message);
 }
 
 @HostApi(dartHostTestHandler: 'TestWebViewClientHostApi')
 abstract class WebViewClientHostApi {
   void create(int instanceId, bool shouldOverrideUrlLoading);
-
-  void dispose(int instanceId);
 }
 
 @FlutterApi()
 abstract class WebViewClientFlutterApi {
+  void dispose(int instanceId);
+
   void onPageStarted(int instanceId, int webViewInstanceId, String url);
 
   void onPageFinished(int instanceId, int webViewInstanceId, String url);
@@ -154,11 +154,12 @@
 @HostApi(dartHostTestHandler: 'TestDownloadListenerHostApi')
 abstract class DownloadListenerHostApi {
   void create(int instanceId);
-  void dispose(int instanceId);
 }
 
 @FlutterApi()
 abstract class DownloadListenerFlutterApi {
+  void dispose(int instanceId);
+
   void onDownloadStart(
     int instanceId,
     String url,
@@ -172,10 +173,11 @@
 @HostApi(dartHostTestHandler: 'TestWebChromeClientHostApi')
 abstract class WebChromeClientHostApi {
   void create(int instanceId, int webViewClientInstanceId);
-  void dispose(int instanceId);
 }
 
 @FlutterApi()
 abstract class WebChromeClientFlutterApi {
+  void dispose(int instanceId);
+
   void onProgressChanged(int instanceId, int webViewInstanceId, int progress);
 }
diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
index 9f9998e..2fe03c8 100644
--- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
@@ -22,10 +22,12 @@
   webview_flutter_platform_interface: ^1.2.0
 
 dev_dependencies:
+  build_runner: ^2.1.4
   flutter_driver:
     sdk: flutter
   flutter_test:
     sdk: flutter
-  pigeon: 1.0.7
+  mockito: ^5.0.16
+  pigeon: 1.0.9
   pedantic: ^1.10.0
 
diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart
index 70aa53c..4173663 100644
--- a/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/android_webview.pigeon.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Autogenerated from Pigeon (v1.0.7), do not edit directly.
+// Autogenerated from Pigeon (v1.0.9), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, avoid_relative_lib_imports
 // @dart = 2.12
@@ -43,10 +43,12 @@
   void removeJavaScriptChannel(int instanceId, int javaScriptChannelInstanceId);
   void setDownloadListener(int instanceId, int listenerInstanceId);
   void setWebChromeClient(int instanceId, int clientInstanceId);
-  static void setup(TestWebViewHostApi? api) {
+  static void setup(TestWebViewHostApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.create', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.create', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -54,10 +56,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.create was null, expected non-null int.');
-          final bool? arg_useHybridComposition = args[1] as bool?;
+          final bool? arg_useHybridComposition = (args[1] as bool?);
           assert(arg_useHybridComposition != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.create was null, expected non-null bool.');
           api.create(arg_instanceId!, arg_useHybridComposition!);
@@ -66,8 +68,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.dispose', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.dispose', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -75,7 +78,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.dispose was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.dispose was null, expected non-null int.');
           api.dispose(arg_instanceId!);
@@ -84,8 +87,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.loadUrl', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.loadUrl', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -93,14 +97,14 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null, expected non-null int.');
-          final String? arg_url = args[1] as String?;
+          final String? arg_url = (args[1] as String?);
           assert(arg_url != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null, expected non-null String.');
           final Map<String?, String?>? arg_headers =
-              args[2] as Map<String?, String?>?;
+              (args[2] as Map<Object?, Object?>?)?.cast<String?, String?>();
           assert(arg_headers != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null, expected non-null Map<String?, String?>.');
           api.loadUrl(arg_instanceId!, arg_url!, arg_headers!);
@@ -109,8 +113,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.getUrl', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.getUrl', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -118,7 +123,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getUrl was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getUrl was null, expected non-null int.');
           final String output = api.getUrl(arg_instanceId!);
@@ -127,8 +132,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.canGoBack', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.canGoBack', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -136,7 +142,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.canGoBack was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.canGoBack was null, expected non-null int.');
           final bool output = api.canGoBack(arg_instanceId!);
@@ -145,8 +151,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.canGoForward', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.canGoForward', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -154,7 +161,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.canGoForward was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.canGoForward was null, expected non-null int.');
           final bool output = api.canGoForward(arg_instanceId!);
@@ -163,8 +170,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.goBack', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.goBack', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -172,7 +180,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.goBack was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.goBack was null, expected non-null int.');
           api.goBack(arg_instanceId!);
@@ -181,8 +189,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.goForward', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.goForward', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -190,7 +199,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.goForward was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.goForward was null, expected non-null int.');
           api.goForward(arg_instanceId!);
@@ -199,8 +208,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.reload', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.reload', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -208,7 +218,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.reload was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.reload was null, expected non-null int.');
           api.reload(arg_instanceId!);
@@ -217,8 +227,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.clearCache', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.clearCache', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -226,10 +237,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null, expected non-null int.');
-          final bool? arg_includeDiskFiles = args[1] as bool?;
+          final bool? arg_includeDiskFiles = (args[1] as bool?);
           assert(arg_includeDiskFiles != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null, expected non-null bool.');
           api.clearCache(arg_instanceId!, arg_includeDiskFiles!);
@@ -238,8 +249,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.evaluateJavascript', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.evaluateJavascript', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -247,10 +259,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null, expected non-null int.');
-          final String? arg_javascriptString = args[1] as String?;
+          final String? arg_javascriptString = (args[1] as String?);
           assert(arg_javascriptString != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null, expected non-null String.');
           final String output = await api.evaluateJavascript(
@@ -260,8 +272,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.getTitle', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.getTitle', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -269,7 +282,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getTitle was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getTitle was null, expected non-null int.');
           final String output = api.getTitle(arg_instanceId!);
@@ -278,8 +291,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.scrollTo', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.scrollTo', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -287,13 +301,13 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null, expected non-null int.');
-          final int? arg_x = args[1] as int?;
+          final int? arg_x = (args[1] as int?);
           assert(arg_x != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null, expected non-null int.');
-          final int? arg_y = args[2] as int?;
+          final int? arg_y = (args[2] as int?);
           assert(arg_y != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null, expected non-null int.');
           api.scrollTo(arg_instanceId!, arg_x!, arg_y!);
@@ -302,8 +316,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.scrollBy', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.scrollBy', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -311,13 +326,13 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null, expected non-null int.');
-          final int? arg_x = args[1] as int?;
+          final int? arg_x = (args[1] as int?);
           assert(arg_x != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null, expected non-null int.');
-          final int? arg_y = args[2] as int?;
+          final int? arg_y = (args[2] as int?);
           assert(arg_y != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null, expected non-null int.');
           api.scrollBy(arg_instanceId!, arg_x!, arg_y!);
@@ -326,8 +341,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.getScrollX', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.getScrollX', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -335,7 +351,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollX was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollX was null, expected non-null int.');
           final int output = api.getScrollX(arg_instanceId!);
@@ -344,8 +360,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.getScrollY', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.getScrollY', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -353,7 +370,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollY was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollY was null, expected non-null int.');
           final int output = api.getScrollY(arg_instanceId!);
@@ -362,9 +379,10 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -372,7 +390,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final bool? arg_enabled = args[0] as bool?;
+          final bool? arg_enabled = (args[0] as bool?);
           assert(arg_enabled != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled was null, expected non-null bool.');
           api.setWebContentsDebuggingEnabled(arg_enabled!);
@@ -381,8 +399,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.setWebViewClient', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.setWebViewClient', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -390,10 +409,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null, expected non-null int.');
-          final int? arg_webViewClientInstanceId = args[1] as int?;
+          final int? arg_webViewClientInstanceId = (args[1] as int?);
           assert(arg_webViewClientInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null, expected non-null int.');
           api.setWebViewClient(arg_instanceId!, arg_webViewClientInstanceId!);
@@ -402,8 +421,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -411,10 +431,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null, expected non-null int.');
-          final int? arg_javaScriptChannelInstanceId = args[1] as int?;
+          final int? arg_javaScriptChannelInstanceId = (args[1] as int?);
           assert(arg_javaScriptChannelInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null, expected non-null int.');
           api.addJavaScriptChannel(
@@ -424,8 +444,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -433,10 +454,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null, expected non-null int.');
-          final int? arg_javaScriptChannelInstanceId = args[1] as int?;
+          final int? arg_javaScriptChannelInstanceId = (args[1] as int?);
           assert(arg_javaScriptChannelInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null, expected non-null int.');
           api.removeJavaScriptChannel(
@@ -446,8 +467,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.setDownloadListener', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.setDownloadListener', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -455,10 +477,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null, expected non-null int.');
-          final int? arg_listenerInstanceId = args[1] as int?;
+          final int? arg_listenerInstanceId = (args[1] as int?);
           assert(arg_listenerInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null, expected non-null int.');
           api.setDownloadListener(arg_instanceId!, arg_listenerInstanceId!);
@@ -467,8 +489,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewHostApi.setWebChromeClient', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewHostApi.setWebChromeClient', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -476,10 +499,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null, expected non-null int.');
-          final int? arg_clientInstanceId = args[1] as int?;
+          final int? arg_clientInstanceId = (args[1] as int?);
           assert(arg_clientInstanceId != null,
               'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null, expected non-null int.');
           api.setWebChromeClient(arg_instanceId!, arg_clientInstanceId!);
@@ -510,10 +533,12 @@
   void setUseWideViewPort(int instanceId, bool use);
   void setDisplayZoomControls(int instanceId, bool enabled);
   void setBuiltInZoomControls(int instanceId, bool enabled);
-  static void setup(TestWebSettingsHostApi? api) {
+  static void setup(TestWebSettingsHostApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.create', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.create', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -521,10 +546,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null, expected non-null int.');
-          final int? arg_webViewInstanceId = args[1] as int?;
+          final int? arg_webViewInstanceId = (args[1] as int?);
           assert(arg_webViewInstanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null, expected non-null int.');
           api.create(arg_instanceId!, arg_webViewInstanceId!);
@@ -533,8 +558,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.dispose', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.dispose', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -542,7 +568,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.dispose was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.dispose was null, expected non-null int.');
           api.dispose(arg_instanceId!);
@@ -551,8 +577,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -560,10 +587,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null, expected non-null int.');
-          final bool? arg_flag = args[1] as bool?;
+          final bool? arg_flag = (args[1] as bool?);
           assert(arg_flag != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null, expected non-null bool.');
           api.setDomStorageEnabled(arg_instanceId!, arg_flag!);
@@ -572,9 +599,10 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -582,10 +610,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null, expected non-null int.');
-          final bool? arg_flag = args[1] as bool?;
+          final bool? arg_flag = (args[1] as bool?);
           assert(arg_flag != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null, expected non-null bool.');
           api.setJavaScriptCanOpenWindowsAutomatically(
@@ -595,9 +623,10 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -605,10 +634,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null, expected non-null int.');
-          final bool? arg_support = args[1] as bool?;
+          final bool? arg_support = (args[1] as bool?);
           assert(arg_support != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null, expected non-null bool.');
           api.setSupportMultipleWindows(arg_instanceId!, arg_support!);
@@ -617,8 +646,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -626,10 +656,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null, expected non-null int.');
-          final bool? arg_flag = args[1] as bool?;
+          final bool? arg_flag = (args[1] as bool?);
           assert(arg_flag != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null, expected non-null bool.');
           api.setJavaScriptEnabled(arg_instanceId!, arg_flag!);
@@ -638,8 +668,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -647,10 +678,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null, expected non-null int.');
-          final String? arg_userAgentString = args[1] as String?;
+          final String? arg_userAgentString = (args[1] as String?);
           assert(arg_userAgentString != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null, expected non-null String.');
           api.setUserAgentString(arg_instanceId!, arg_userAgentString!);
@@ -659,9 +690,10 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -669,10 +701,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null, expected non-null int.');
-          final bool? arg_require = args[1] as bool?;
+          final bool? arg_require = (args[1] as bool?);
           assert(arg_require != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null, expected non-null bool.');
           api.setMediaPlaybackRequiresUserGesture(
@@ -682,8 +714,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -691,10 +724,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null, expected non-null int.');
-          final bool? arg_support = args[1] as bool?;
+          final bool? arg_support = (args[1] as bool?);
           assert(arg_support != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null, expected non-null bool.');
           api.setSupportZoom(arg_instanceId!, arg_support!);
@@ -703,9 +736,10 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
           'dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode',
-          codec);
+          codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -713,10 +747,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null, expected non-null int.');
-          final bool? arg_overview = args[1] as bool?;
+          final bool? arg_overview = (args[1] as bool?);
           assert(arg_overview != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null, expected non-null bool.');
           api.setLoadWithOverviewMode(arg_instanceId!, arg_overview!);
@@ -725,8 +759,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -734,10 +769,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null, expected non-null int.');
-          final bool? arg_use = args[1] as bool?;
+          final bool? arg_use = (args[1] as bool?);
           assert(arg_use != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null, expected non-null bool.');
           api.setUseWideViewPort(arg_instanceId!, arg_use!);
@@ -746,9 +781,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls',
-          codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -756,10 +791,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null, expected non-null int.');
-          final bool? arg_enabled = args[1] as bool?;
+          final bool? arg_enabled = (args[1] as bool?);
           assert(arg_enabled != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null, expected non-null bool.');
           api.setDisplayZoomControls(arg_instanceId!, arg_enabled!);
@@ -768,9 +803,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls',
-          codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -778,10 +813,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null, expected non-null int.');
-          final bool? arg_enabled = args[1] as bool?;
+          final bool? arg_enabled = (args[1] as bool?);
           assert(arg_enabled != null,
               'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null, expected non-null bool.');
           api.setBuiltInZoomControls(arg_instanceId!, arg_enabled!);
@@ -801,11 +836,12 @@
       _TestJavaScriptChannelHostApiCodec();
 
   void create(int instanceId, String channelName);
-  void dispose(int instanceId);
-  static void setup(TestJavaScriptChannelHostApi? api) {
+  static void setup(TestJavaScriptChannelHostApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.JavaScriptChannelHostApi.create', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.JavaScriptChannelHostApi.create', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -813,10 +849,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null, expected non-null int.');
-          final String? arg_channelName = args[1] as String?;
+          final String? arg_channelName = (args[1] as String?);
           assert(arg_channelName != null,
               'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null, expected non-null String.');
           api.create(arg_instanceId!, arg_channelName!);
@@ -824,24 +860,6 @@
         });
       }
     }
-    {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.JavaScriptChannelHostApi.dispose', codec);
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((Object? message) async {
-          assert(message != null,
-              'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.dispose was null.');
-          final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
-          assert(arg_instanceId != null,
-              'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.dispose was null, expected non-null int.');
-          api.dispose(arg_instanceId!);
-          return <Object?, Object?>{};
-        });
-      }
-    }
   }
 }
 
@@ -853,11 +871,12 @@
   static const MessageCodec<Object?> codec = _TestWebViewClientHostApiCodec();
 
   void create(int instanceId, bool shouldOverrideUrlLoading);
-  void dispose(int instanceId);
-  static void setup(TestWebViewClientHostApi? api) {
+  static void setup(TestWebViewClientHostApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientHostApi.create', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebViewClientHostApi.create', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -865,10 +884,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null, expected non-null int.');
-          final bool? arg_shouldOverrideUrlLoading = args[1] as bool?;
+          final bool? arg_shouldOverrideUrlLoading = (args[1] as bool?);
           assert(arg_shouldOverrideUrlLoading != null,
               'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null, expected non-null bool.');
           api.create(arg_instanceId!, arg_shouldOverrideUrlLoading!);
@@ -876,24 +895,6 @@
         });
       }
     }
-    {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebViewClientHostApi.dispose', codec);
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((Object? message) async {
-          assert(message != null,
-              'Argument for dev.flutter.pigeon.WebViewClientHostApi.dispose was null.');
-          final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
-          assert(arg_instanceId != null,
-              'Argument for dev.flutter.pigeon.WebViewClientHostApi.dispose was null, expected non-null int.');
-          api.dispose(arg_instanceId!);
-          return <Object?, Object?>{};
-        });
-      }
-    }
   }
 }
 
@@ -906,11 +907,12 @@
       _TestDownloadListenerHostApiCodec();
 
   void create(int instanceId);
-  void dispose(int instanceId);
-  static void setup(TestDownloadListenerHostApi? api) {
+  static void setup(TestDownloadListenerHostApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.DownloadListenerHostApi.create', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.DownloadListenerHostApi.create', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -918,7 +920,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.DownloadListenerHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.DownloadListenerHostApi.create was null, expected non-null int.');
           api.create(arg_instanceId!);
@@ -926,24 +928,6 @@
         });
       }
     }
-    {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.DownloadListenerHostApi.dispose', codec);
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((Object? message) async {
-          assert(message != null,
-              'Argument for dev.flutter.pigeon.DownloadListenerHostApi.dispose was null.');
-          final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
-          assert(arg_instanceId != null,
-              'Argument for dev.flutter.pigeon.DownloadListenerHostApi.dispose was null, expected non-null int.');
-          api.dispose(arg_instanceId!);
-          return <Object?, Object?>{};
-        });
-      }
-    }
   }
 }
 
@@ -955,11 +939,12 @@
   static const MessageCodec<Object?> codec = _TestWebChromeClientHostApiCodec();
 
   void create(int instanceId, int webViewClientInstanceId);
-  void dispose(int instanceId);
-  static void setup(TestWebChromeClientHostApi? api) {
+  static void setup(TestWebChromeClientHostApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebChromeClientHostApi.create', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.WebChromeClientHostApi.create', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMockMessageHandler(null);
       } else {
@@ -967,10 +952,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
+          final int? arg_instanceId = (args[0] as int?);
           assert(arg_instanceId != null,
               'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null, expected non-null int.');
-          final int? arg_webViewClientInstanceId = args[1] as int?;
+          final int? arg_webViewClientInstanceId = (args[1] as int?);
           assert(arg_webViewClientInstanceId != null,
               'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null, expected non-null int.');
           api.create(arg_instanceId!, arg_webViewClientInstanceId!);
@@ -978,23 +963,5 @@
         });
       }
     }
-    {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.WebChromeClientHostApi.dispose', codec);
-      if (api == null) {
-        channel.setMockMessageHandler(null);
-      } else {
-        channel.setMockMessageHandler((Object? message) async {
-          assert(message != null,
-              'Argument for dev.flutter.pigeon.WebChromeClientHostApi.dispose was null.');
-          final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_instanceId = args[0] as int?;
-          assert(arg_instanceId != null,
-              'Argument for dev.flutter.pigeon.WebChromeClientHostApi.dispose was null, expected non-null int.');
-          api.dispose(arg_instanceId!);
-          return <Object?, Object?>{};
-        });
-      }
-    }
   }
 }
diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart
index 462670a..24cd35c 100644
--- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart
@@ -3,371 +3,592 @@
 // found in the LICENSE file.
 
 import 'package:flutter_test/flutter_test.dart';
+import 'package:mockito/annotations.dart';
+import 'package:mockito/mockito.dart';
 import 'package:webview_flutter_android/src/android_webview.dart';
+import 'package:webview_flutter_android/src/android_webview.pigeon.dart';
 import 'package:webview_flutter_android/src/android_webview_api_impls.dart';
 import 'package:webview_flutter_android/src/instance_manager.dart';
 
 import 'android_webview.pigeon.dart';
+import 'android_webview_test.mocks.dart';
 
+@GenerateMocks([
+  DownloadListener,
+  JavaScriptChannel,
+  TestDownloadListenerHostApi,
+  TestJavaScriptChannelHostApi,
+  TestWebChromeClientHostApi,
+  TestWebSettingsHostApi,
+  TestWebViewClientHostApi,
+  TestWebViewHostApi,
+  WebChromeClient,
+  WebView,
+  WebViewClient,
+])
 void main() {
   TestWidgetsFlutterBinding.ensureInitialized();
 
   group('Android WebView', () {
     group('$WebView', () {
-      setUpAll(() {
-        TestWebViewHostApi.setup(TestWebViewHostApiImpl());
-      });
+      late MockTestWebViewHostApi mockPlatformHostApi;
+
+      late InstanceManager instanceManager;
+
+      late WebView webView;
+      late int webViewInstanceId;
 
       setUp(() {
-        WebView.api = WebViewHostApiImpl(instanceManager: InstanceManager());
+        mockPlatformHostApi = MockTestWebViewHostApi();
+        TestWebViewHostApi.setup(mockPlatformHostApi);
+
+        instanceManager = InstanceManager();
+        WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
+
+        webView = WebView();
+        webViewInstanceId = instanceManager.getInstanceId(webView)!;
       });
 
       test('create', () {
-        final WebView webView = WebView();
-        expect(WebView.api.instanceManager.getInstanceId(webView), isNotNull);
+        verify(mockPlatformHostApi.create(webViewInstanceId, false));
+      });
+
+      test('setWebContentsDebuggingEnabled', () {
+        WebView.setWebContentsDebuggingEnabled(true);
+        verify(mockPlatformHostApi.setWebContentsDebuggingEnabled(true));
+      });
+
+      test('loadUrl', () {
+        webView.loadUrl('hello', <String, String>{'a': 'header'});
+        verify(mockPlatformHostApi.loadUrl(
+          webViewInstanceId,
+          'hello',
+          <String, String>{'a': 'header'},
+        ));
+      });
+
+      test('canGoBack', () {
+        when(mockPlatformHostApi.canGoBack(webViewInstanceId))
+            .thenReturn(false);
+        expect(webView.canGoBack(), completion(false));
+      });
+
+      test('canGoForward', () {
+        when(mockPlatformHostApi.canGoForward(webViewInstanceId))
+            .thenReturn(true);
+        expect(webView.canGoForward(), completion(true));
+      });
+
+      test('goBack', () {
+        webView.goBack();
+        verify(mockPlatformHostApi.goBack(webViewInstanceId));
+      });
+
+      test('goForward', () {
+        webView.goForward();
+        verify(mockPlatformHostApi.goForward(webViewInstanceId));
+      });
+
+      test('reload', () {
+        webView.reload();
+        verify(mockPlatformHostApi.reload(webViewInstanceId));
+      });
+
+      test('clearCache', () {
+        webView.clearCache(false);
+        verify(mockPlatformHostApi.clearCache(webViewInstanceId, false));
+      });
+
+      test('evaluateJavascript', () {
+        when(
+          mockPlatformHostApi.evaluateJavascript(
+              webViewInstanceId, 'runJavaScript'),
+        ).thenAnswer((_) => Future<String>.value('returnValue'));
+        expect(
+          webView.evaluateJavascript('runJavaScript'),
+          completion('returnValue'),
+        );
+      });
+
+      test('getTitle', () {
+        when(mockPlatformHostApi.getTitle(webViewInstanceId))
+            .thenReturn('aTitle');
+        expect(webView.getTitle(), completion('aTitle'));
+      });
+
+      test('scrollTo', () {
+        webView.scrollTo(12, 13);
+        verify(mockPlatformHostApi.scrollTo(webViewInstanceId, 12, 13));
+      });
+
+      test('scrollBy', () {
+        webView.scrollBy(12, 14);
+        verify(mockPlatformHostApi.scrollBy(webViewInstanceId, 12, 14));
+      });
+
+      test('getScrollX', () {
+        when(mockPlatformHostApi.getScrollX(webViewInstanceId)).thenReturn(67);
+        expect(webView.getScrollX(), completion(67));
+      });
+
+      test('getScrollY', () {
+        when(mockPlatformHostApi.getScrollY(webViewInstanceId)).thenReturn(56);
+        expect(webView.getScrollY(), completion(56));
+      });
+
+      test('setWebViewClient', () {
+        TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi());
+        WebViewClient.api = WebViewClientHostApiImpl(
+          instanceManager: instanceManager,
+        );
+
+        final WebViewClient mockWebViewClient = MockWebViewClient();
+        when(mockWebViewClient.shouldOverrideUrlLoading).thenReturn(false);
+        webView.setWebViewClient(mockWebViewClient);
+
+        final int webViewClientInstanceId =
+            instanceManager.getInstanceId(mockWebViewClient)!;
+        verify(mockPlatformHostApi.setWebViewClient(
+          webViewInstanceId,
+          webViewClientInstanceId,
+        ));
+      });
+
+      test('addJavaScriptChannel', () {
+        TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi());
+        JavaScriptChannel.api = JavaScriptChannelHostApiImpl(
+          instanceManager: instanceManager,
+        );
+
+        final JavaScriptChannel mockJavaScriptChannel = MockJavaScriptChannel();
+        when(mockJavaScriptChannel.channelName).thenReturn('aChannel');
+
+        webView.addJavaScriptChannel(mockJavaScriptChannel);
+
+        final int javaScriptChannelInstanceId =
+            instanceManager.getInstanceId(mockJavaScriptChannel)!;
+        verify(mockPlatformHostApi.addJavaScriptChannel(
+          webViewInstanceId,
+          javaScriptChannelInstanceId,
+        ));
+      });
+
+      test('removeJavaScriptChannel', () {
+        TestJavaScriptChannelHostApi.setup(MockTestJavaScriptChannelHostApi());
+        JavaScriptChannel.api = JavaScriptChannelHostApiImpl(
+          instanceManager: instanceManager,
+        );
+
+        final JavaScriptChannel mockJavaScriptChannel = MockJavaScriptChannel();
+        when(mockJavaScriptChannel.channelName).thenReturn('aChannel');
+
+        expect(
+          webView.removeJavaScriptChannel(mockJavaScriptChannel),
+          completes,
+        );
+
+        webView.addJavaScriptChannel(mockJavaScriptChannel);
+        webView.removeJavaScriptChannel(mockJavaScriptChannel);
+
+        final int javaScriptChannelInstanceId =
+            instanceManager.getInstanceId(mockJavaScriptChannel)!;
+        verify(mockPlatformHostApi.removeJavaScriptChannel(
+          webViewInstanceId,
+          javaScriptChannelInstanceId,
+        ));
+      });
+
+      test('setDownloadListener', () {
+        TestDownloadListenerHostApi.setup(MockTestDownloadListenerHostApi());
+        DownloadListener.api = DownloadListenerHostApiImpl(
+          instanceManager: instanceManager,
+        );
+
+        final DownloadListener mockDownloadListener = MockDownloadListener();
+        webView.setDownloadListener(mockDownloadListener);
+
+        final int downloadListenerInstanceId =
+            instanceManager.getInstanceId(mockDownloadListener)!;
+        verify(mockPlatformHostApi.setDownloadListener(
+          webViewInstanceId,
+          downloadListenerInstanceId,
+        ));
+      });
+
+      test('setWebChromeClient', () {
+        // Setting a WebChromeClient requires setting a WebViewClient first.
+        TestWebViewClientHostApi.setup(MockTestWebViewClientHostApi());
+        WebViewClient.api = WebViewClientHostApiImpl(
+          instanceManager: instanceManager,
+        );
+        final WebViewClient mockWebViewClient = MockWebViewClient();
+        when(mockWebViewClient.shouldOverrideUrlLoading).thenReturn(false);
+        webView.setWebViewClient(mockWebViewClient);
+
+        TestWebChromeClientHostApi.setup(MockTestWebChromeClientHostApi());
+        WebChromeClient.api = WebChromeClientHostApiImpl(
+          instanceManager: instanceManager,
+        );
+
+        final WebChromeClient mockWebChromeClient = MockWebChromeClient();
+        webView.setWebChromeClient(mockWebChromeClient);
+
+        final int webChromeClientInstanceId =
+            instanceManager.getInstanceId(mockWebChromeClient)!;
+        verify(mockPlatformHostApi.setWebChromeClient(
+          webViewInstanceId,
+          webChromeClientInstanceId,
+        ));
+      });
+
+      test('release', () {
+        final MockTestWebSettingsHostApi mockWebSettingsPlatformHostApi =
+            MockTestWebSettingsHostApi();
+        TestWebSettingsHostApi.setup(mockWebSettingsPlatformHostApi);
+
+        WebSettings.api =
+            WebSettingsHostApiImpl(instanceManager: instanceManager);
+        final int webSettingsInstanceId =
+            instanceManager.getInstanceId(webView.settings)!;
+
+        webView.release();
+        verify(mockWebSettingsPlatformHostApi.dispose(webSettingsInstanceId));
+        verify(mockPlatformHostApi.dispose(webViewInstanceId));
       });
     });
 
     group('$WebSettings', () {
-      setUpAll(() {
-        TestWebViewHostApi.setup(TestWebViewHostApiImpl());
-        TestWebSettingsHostApi.setup(TestWebSettingsHostApiImpl());
-      });
+      late MockTestWebSettingsHostApi mockPlatformHostApi;
+
+      late InstanceManager instanceManager;
+
+      late WebSettings webSettings;
+      late int webSettingsInstanceId;
 
       setUp(() {
-        final InstanceManager instanceManager = InstanceManager();
+        instanceManager = InstanceManager();
+
+        TestWebViewHostApi.setup(MockTestWebViewHostApi());
         WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
+
+        mockPlatformHostApi = MockTestWebSettingsHostApi();
+        TestWebSettingsHostApi.setup(mockPlatformHostApi);
+
         WebSettings.api = WebSettingsHostApiImpl(
           instanceManager: instanceManager,
         );
+
+        webSettings = WebSettings(WebView());
+        webSettingsInstanceId = instanceManager.getInstanceId(webSettings)!;
       });
 
       test('create', () {
-        final WebView webView = WebView();
-        final WebSettings webSettings = WebSettings(webView);
-        expect(
-          WebSettings.api.instanceManager.getInstanceId(webSettings),
-          isNotNull,
-        );
+        verify(mockPlatformHostApi.create(webSettingsInstanceId, any));
+      });
+
+      test('setDomStorageEnabled', () {
+        webSettings.setDomStorageEnabled(false);
+        verify(mockPlatformHostApi.setDomStorageEnabled(
+          webSettingsInstanceId,
+          false,
+        ));
+      });
+
+      test('setJavaScriptCanOpenWindowsAutomatically', () {
+        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
+        verify(mockPlatformHostApi.setJavaScriptCanOpenWindowsAutomatically(
+          webSettingsInstanceId,
+          true,
+        ));
+      });
+
+      test('setSupportMultipleWindows', () {
+        webSettings.setSupportMultipleWindows(false);
+        verify(mockPlatformHostApi.setSupportMultipleWindows(
+          webSettingsInstanceId,
+          false,
+        ));
+      });
+
+      test('setJavaScriptEnabled', () {
+        webSettings.setJavaScriptEnabled(true);
+        verify(mockPlatformHostApi.setJavaScriptEnabled(
+          webSettingsInstanceId,
+          true,
+        ));
+      });
+
+      test('setUserAgentString', () {
+        webSettings.setUserAgentString('hola');
+        verify(mockPlatformHostApi.setUserAgentString(
+          webSettingsInstanceId,
+          'hola',
+        ));
+      });
+
+      test('setMediaPlaybackRequiresUserGesture', () {
+        webSettings.setMediaPlaybackRequiresUserGesture(false);
+        verify(mockPlatformHostApi.setMediaPlaybackRequiresUserGesture(
+          webSettingsInstanceId,
+          false,
+        ));
+      });
+
+      test('setSupportZoom', () {
+        webSettings.setSupportZoom(true);
+        verify(mockPlatformHostApi.setSupportZoom(
+          webSettingsInstanceId,
+          true,
+        ));
+      });
+
+      test('setLoadWithOverviewMode', () {
+        webSettings.setLoadWithOverviewMode(false);
+        verify(mockPlatformHostApi.setLoadWithOverviewMode(
+          webSettingsInstanceId,
+          false,
+        ));
+      });
+
+      test('setUseWideViewPort', () {
+        webSettings.setUseWideViewPort(true);
+        verify(mockPlatformHostApi.setUseWideViewPort(
+          webSettingsInstanceId,
+          true,
+        ));
+      });
+
+      test('setDisplayZoomControls', () {
+        webSettings.setDisplayZoomControls(false);
+        verify(mockPlatformHostApi.setDisplayZoomControls(
+          webSettingsInstanceId,
+          false,
+        ));
+      });
+
+      test('setBuiltInZoomControls', () {
+        webSettings.setBuiltInZoomControls(true);
+        verify(mockPlatformHostApi.setBuiltInZoomControls(
+          webSettingsInstanceId,
+          true,
+        ));
       });
     });
 
     group('$JavaScriptChannel', () {
-      setUpAll(() {
-        TestWebViewHostApi.setup(TestWebViewHostApiImpl());
-        TestJavaScriptChannelHostApi.setup(TestJavaScriptChannelHostApiImpl());
-      });
+      late JavaScriptChannelFlutterApiImpl flutterApi;
+
+      late InstanceManager instanceManager;
+
+      late MockJavaScriptChannel mockJavaScriptChannel;
+      late int mockJavaScriptChannelInstanceId;
 
       setUp(() {
-        final InstanceManager instanceManager = InstanceManager();
-        WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
-        JavaScriptChannel.api = JavaScriptChannelHostApiImpl(
+        instanceManager = InstanceManager();
+        flutterApi = JavaScriptChannelFlutterApiImpl(
           instanceManager: instanceManager,
         );
+
+        mockJavaScriptChannel = MockJavaScriptChannel();
+        mockJavaScriptChannelInstanceId =
+            instanceManager.tryAddInstance(mockJavaScriptChannel)!;
       });
 
-      test('create', () {
-        final WebView webView = WebView();
-        final JavaScriptChannel channel = TestJavaScriptChannel('myChannel');
-
-        webView.addJavaScriptChannel(channel);
-        expect(
-          JavaScriptChannel.api.instanceManager.getInstanceId(channel),
-          isNotNull,
+      test('postMessage', () {
+        flutterApi.postMessage(
+          mockJavaScriptChannelInstanceId,
+          'Hello, World!',
         );
-
-        webView.removeJavaScriptChannel(channel);
-        expect(
-          JavaScriptChannel.api.instanceManager.getInstanceId(channel),
-          isNull,
-        );
+        verify(mockJavaScriptChannel.postMessage('Hello, World!'));
       });
     });
 
     group('$WebViewClient', () {
-      setUpAll(() {
-        TestWebViewHostApi.setup(TestWebViewHostApiImpl());
-        TestWebViewClientHostApi.setup(TestWebViewClientHostApiImpl());
-      });
+      late WebViewClientFlutterApiImpl flutterApi;
+
+      late InstanceManager instanceManager;
+
+      late MockWebViewClient mockWebViewClient;
+      late int mockWebViewClientInstanceId;
+
+      late MockWebView mockWebView;
+      late int mockWebViewInstanceId;
 
       setUp(() {
-        final InstanceManager instanceManager = InstanceManager();
-        WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
-        WebViewClient.api = WebViewClientHostApiImpl(
+        instanceManager = InstanceManager();
+        flutterApi = WebViewClientFlutterApiImpl(
           instanceManager: instanceManager,
         );
+
+        mockWebViewClient = MockWebViewClient();
+        mockWebViewClientInstanceId =
+            instanceManager.tryAddInstance(mockWebViewClient)!;
+
+        mockWebView = MockWebView();
+        mockWebViewInstanceId = instanceManager.tryAddInstance(mockWebView)!;
       });
 
-      test('create', () {
-        final WebView webView = WebView();
-        final WebViewClient webViewClient1 = TestWebViewClient();
-        final WebViewClient webViewClient2 = TestWebViewClient();
+      test('onPageStarted', () {
+        flutterApi.onPageStarted(
+          mockWebViewClientInstanceId,
+          mockWebViewInstanceId,
+          'https://www.google.com',
+        );
+        verify(mockWebViewClient.onPageStarted(
+          mockWebView,
+          'https://www.google.com',
+        ));
+      });
 
-        webView.setWebViewClient(webViewClient1);
-        expect(
-          WebViewClient.api.instanceManager.getInstanceId(webViewClient1),
-          isNotNull,
+      test('onPageFinished', () {
+        flutterApi.onPageFinished(
+          mockWebViewClientInstanceId,
+          mockWebViewInstanceId,
+          'https://www.google.com',
+        );
+        verify(mockWebViewClient.onPageFinished(
+          mockWebView,
+          'https://www.google.com',
+        ));
+      });
+
+      test('onReceivedRequestError', () {
+        flutterApi.onReceivedRequestError(
+          mockWebViewClientInstanceId,
+          mockWebViewInstanceId,
+          WebResourceRequestData()
+            ..url = 'https://www.google.com'
+            ..isForMainFrame = true
+            ..hasGesture = true
+            ..method = 'POST',
+          WebResourceErrorData()
+            ..errorCode = 34
+            ..description = 'error description',
         );
 
-        webView.setWebViewClient(webViewClient2);
-        expect(
-          WebViewClient.api.instanceManager.getInstanceId(webViewClient1),
-          isNull,
+        verify(mockWebViewClient.onReceivedRequestError(
+          mockWebView,
+          argThat(isNotNull),
+          argThat(isNotNull),
+        ));
+      });
+
+      test('onReceivedError', () {
+        flutterApi.onReceivedError(
+          mockWebViewClientInstanceId,
+          mockWebViewInstanceId,
+          14,
+          'desc',
+          'https://www.google.com',
         );
+
+        verify(mockWebViewClient.onReceivedError(
+          mockWebView,
+          14,
+          'desc',
+          'https://www.google.com',
+        ));
+      });
+
+      test('requestLoading', () {
+        flutterApi.requestLoading(
+          mockWebViewClientInstanceId,
+          mockWebViewInstanceId,
+          WebResourceRequestData()
+            ..url = 'https://www.google.com'
+            ..isForMainFrame = true
+            ..hasGesture = true
+            ..method = 'POST',
+        );
+
+        verify(mockWebViewClient.requestLoading(
+          mockWebView,
+          argThat(isNotNull),
+        ));
+      });
+
+      test('urlLoading', () {
+        flutterApi.urlLoading(mockWebViewClientInstanceId,
+            mockWebViewInstanceId, 'https://www.google.com');
+
+        verify(mockWebViewClient.urlLoading(
+          mockWebView,
+          'https://www.google.com',
+        ));
       });
     });
 
     group('$DownloadListener', () {
-      setUpAll(() {
-        TestWebViewHostApi.setup(TestWebViewHostApiImpl());
-        TestDownloadListenerHostApi.setup(TestDownloadListenerHostApiImpl());
-      });
+      late DownloadListenerFlutterApiImpl flutterApi;
+
+      late InstanceManager instanceManager;
+
+      late MockDownloadListener mockDownloadListener;
+      late int mockDownloadListenerInstanceId;
 
       setUp(() {
-        final InstanceManager instanceManager = InstanceManager();
-        WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
-        DownloadListener.api = DownloadListenerHostApiImpl(
+        instanceManager = InstanceManager();
+        flutterApi = DownloadListenerFlutterApiImpl(
           instanceManager: instanceManager,
         );
+
+        mockDownloadListener = MockDownloadListener();
+        mockDownloadListenerInstanceId =
+            instanceManager.tryAddInstance(mockDownloadListener)!;
       });
 
-      test('create', () {
-        final WebView webView = WebView();
-        final DownloadListener downloadListener1 = TestDownloadListener();
-        final DownloadListener downloadListener2 = TestDownloadListener();
-
-        webView.setDownloadListener(downloadListener1);
-        expect(
-          DownloadListener.api.instanceManager.getInstanceId(downloadListener1),
-          isNotNull,
+      test('onPageStarted', () {
+        flutterApi.onDownloadStart(
+          mockDownloadListenerInstanceId,
+          'url',
+          'userAgent',
+          'contentDescription',
+          'mimetype',
+          45,
         );
-
-        webView.setDownloadListener(downloadListener2);
-        expect(
-          DownloadListener.api.instanceManager.getInstanceId(downloadListener1),
-          isNull,
-        );
+        verify(mockDownloadListener.onDownloadStart(
+          'url',
+          'userAgent',
+          'contentDescription',
+          'mimetype',
+          45,
+        ));
       });
     });
 
     group('$WebChromeClient', () {
-      setUpAll(() {
-        TestWebViewHostApi.setup(TestWebViewHostApiImpl());
-        TestWebViewClientHostApi.setup(TestWebViewClientHostApiImpl());
-        TestWebChromeClientHostApi.setup(TestWebChromeClientHostApiImpl());
-      });
+      late WebChromeClientFlutterApiImpl flutterApi;
+
+      late InstanceManager instanceManager;
+
+      late MockWebChromeClient mockWebChromeClient;
+      late int mockWebChromeClientInstanceId;
+
+      late MockWebView mockWebView;
+      late int mockWebViewInstanceId;
 
       setUp(() {
-        final InstanceManager instanceManager = InstanceManager();
-        WebView.api = WebViewHostApiImpl(instanceManager: instanceManager);
-        WebViewClient.api = WebViewClientHostApiImpl(
+        instanceManager = InstanceManager();
+        flutterApi = WebChromeClientFlutterApiImpl(
           instanceManager: instanceManager,
         );
-        WebChromeClient.api = WebChromeClientHostApiImpl(
-          instanceManager: instanceManager,
-        );
+
+        mockWebChromeClient = MockWebChromeClient();
+        mockWebChromeClientInstanceId =
+            instanceManager.tryAddInstance(mockWebChromeClient)!;
+
+        mockWebView = MockWebView();
+        mockWebViewInstanceId = instanceManager.tryAddInstance(mockWebView)!;
       });
 
-      test('create', () {
-        final WebView webView = WebView();
-        webView.setWebViewClient(TestWebViewClient());
-
-        final WebChromeClient webChromeClient1 = TestWebChromeClient();
-        final WebChromeClient webChromeClient2 = TestWebChromeClient();
-
-        webView.setWebChromeClient(webChromeClient1);
-        expect(
-          WebChromeClient.api.instanceManager.getInstanceId(webChromeClient1),
-          isNotNull,
+      test('onPageStarted', () {
+        flutterApi.onProgressChanged(
+          mockWebChromeClientInstanceId,
+          mockWebViewInstanceId,
+          76,
         );
-
-        webView.setWebChromeClient(webChromeClient2);
-        expect(
-          WebChromeClient.api.instanceManager.getInstanceId(webChromeClient1),
-          isNull,
-        );
+        verify(mockWebChromeClient.onProgressChanged(mockWebView, 76));
       });
     });
   });
 }
-
-class TestJavaScriptChannel extends JavaScriptChannel {
-  TestJavaScriptChannel(String channelName) : super(channelName);
-
-  @override
-  void postMessage(String message) {}
-}
-
-class TestWebViewClient extends WebViewClient {}
-
-class TestDownloadListener extends DownloadListener {
-  @override
-  void onDownloadStart(
-    String url,
-    String userAgent,
-    String contentDisposition,
-    String mimetype,
-    int contentLength,
-  ) {}
-}
-
-class TestWebChromeClient extends WebChromeClient {
-  @override
-  void onProgressChanged(WebView webView, int progress) {}
-}
-
-class TestWebViewHostApiImpl extends TestWebViewHostApi {
-  @override
-  void addJavaScriptChannel(int instanceId, int javaScriptChannelInstanceId) {}
-
-  @override
-  bool canGoBack(int instanceId) {
-    throw UnimplementedError();
-  }
-
-  @override
-  bool canGoForward(int instanceId) {
-    throw UnimplementedError();
-  }
-
-  @override
-  void clearCache(int instanceId, bool includeDiskFiles) {}
-
-  @override
-  void create(int instanceId, bool useHybridComposition) {}
-
-  @override
-  void dispose(int instanceId) {}
-
-  @override
-  Future<String> evaluateJavascript(int instanceId, String javascriptString) {
-    throw UnimplementedError();
-  }
-
-  @override
-  int getScrollX(int instanceId) {
-    throw UnimplementedError();
-  }
-
-  @override
-  int getScrollY(int instanceId) {
-    throw UnimplementedError();
-  }
-
-  @override
-  String getTitle(int instanceId) {
-    throw UnimplementedError();
-  }
-
-  @override
-  String getUrl(int instanceId) {
-    throw UnimplementedError();
-  }
-
-  @override
-  void goBack(int instanceId) {}
-
-  @override
-  void goForward(int instanceId) {}
-
-  @override
-  void loadUrl(int instanceId, String url, Map headers) {}
-
-  @override
-  void reload(int instanceId) {}
-
-  @override
-  void removeJavaScriptChannel(
-      int instanceId, int javaScriptChannelInstanceId) {}
-
-  @override
-  void scrollBy(int instanceId, int x, int y) {}
-
-  @override
-  void scrollTo(int instanceId, int x, int y) {}
-
-  @override
-  void setDownloadListener(int instanceId, int listenerInstanceId) {}
-
-  @override
-  void setWebContentsDebuggingEnabled(bool enabled) {}
-
-  @override
-  void setWebViewClient(int instanceId, int webViewClientInstanceId) {}
-
-  @override
-  void setWebChromeClient(int instanceId, int clientInstanceId) {}
-}
-
-class TestWebSettingsHostApiImpl extends TestWebSettingsHostApi {
-  @override
-  void create(int instanceId, int webViewInstanceId) {}
-
-  @override
-  void dispose(int instanceId) {}
-
-  @override
-  void setBuiltInZoomControls(int instanceId, bool enabled) {}
-
-  @override
-  void setDisplayZoomControls(int instanceId, bool enabled) {}
-
-  @override
-  void setDomStorageEnabled(int instanceId, bool flag) {}
-
-  @override
-  void setJavaScriptCanOpenWindowsAutomatically(int instanceId, bool flag) {}
-
-  @override
-  void setJavaScriptEnabled(int instanceId, bool flag) {}
-
-  @override
-  void setLoadWithOverviewMode(int instanceId, bool overview) {}
-
-  @override
-  void setMediaPlaybackRequiresUserGesture(int instanceId, bool require) {}
-
-  @override
-  void setSupportMultipleWindows(int instanceId, bool support) {}
-
-  @override
-  void setSupportZoom(int instanceId, bool support) {}
-
-  @override
-  void setUseWideViewPort(int instanceId, bool use) {}
-
-  @override
-  void setUserAgentString(int instanceId, String userAgentString) {}
-}
-
-class TestJavaScriptChannelHostApiImpl extends TestJavaScriptChannelHostApi {
-  @override
-  void create(int instanceId, String channelName) {}
-
-  @override
-  void dispose(int instanceId) {}
-}
-
-class TestWebViewClientHostApiImpl extends TestWebViewClientHostApi {
-  @override
-  void create(int instanceId, bool shouldOverrideUrlLoading) {}
-
-  @override
-  void dispose(int instanceId) {}
-}
-
-class TestDownloadListenerHostApiImpl extends TestDownloadListenerHostApi {
-  @override
-  void create(int instanceId) {}
-
-  @override
-  void dispose(int instanceId) {}
-}
-
-class TestWebChromeClientHostApiImpl extends TestWebChromeClientHostApi {
-  @override
-  void create(int instanceId, int webViewClientInstanceId) {}
-
-  @override
-  void dispose(int instanceId) {}
-}
diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart
new file mode 100644
index 0000000..4378ed7
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart
@@ -0,0 +1,505 @@
+// 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.
+
+// Mocks generated by Mockito 5.0.16 from annotations
+// in webview_flutter_android/test/android_webview_test.dart.
+// Do not manually edit this file.
+
+import 'dart:async' as _i4;
+
+import 'package:mockito/mockito.dart' as _i1;
+import 'package:webview_flutter_android/src/android_webview.dart' as _i2;
+
+import 'android_webview.pigeon.dart' as _i3;
+
+// ignore_for_file: avoid_redundant_argument_values
+// ignore_for_file: avoid_setters_without_getters
+// ignore_for_file: comment_references
+// ignore_for_file: implementation_imports
+// ignore_for_file: invalid_use_of_visible_for_testing_member
+// ignore_for_file: prefer_const_constructors
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: camel_case_types
+
+class _FakeWebSettings_0 extends _i1.Fake implements _i2.WebSettings {}
+
+/// A class which mocks [DownloadListener].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockDownloadListener extends _i1.Mock implements _i2.DownloadListener {
+  MockDownloadListener() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void onDownloadStart(String? url, String? userAgent,
+          String? contentDisposition, String? mimetype, int? contentLength) =>
+      super.noSuchMethod(
+          Invocation.method(#onDownloadStart,
+              [url, userAgent, contentDisposition, mimetype, contentLength]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [JavaScriptChannel].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockJavaScriptChannel extends _i1.Mock implements _i2.JavaScriptChannel {
+  MockJavaScriptChannel() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  String get channelName =>
+      (super.noSuchMethod(Invocation.getter(#channelName), returnValue: '')
+          as String);
+  @override
+  void postMessage(String? message) =>
+      super.noSuchMethod(Invocation.method(#postMessage, [message]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [TestDownloadListenerHostApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockTestDownloadListenerHostApi extends _i1.Mock
+    implements _i3.TestDownloadListenerHostApi {
+  MockTestDownloadListenerHostApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void create(int? instanceId) =>
+      super.noSuchMethod(Invocation.method(#create, [instanceId]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [TestJavaScriptChannelHostApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockTestJavaScriptChannelHostApi extends _i1.Mock
+    implements _i3.TestJavaScriptChannelHostApi {
+  MockTestJavaScriptChannelHostApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void create(int? instanceId, String? channelName) =>
+      super.noSuchMethod(Invocation.method(#create, [instanceId, channelName]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [TestWebChromeClientHostApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockTestWebChromeClientHostApi extends _i1.Mock
+    implements _i3.TestWebChromeClientHostApi {
+  MockTestWebChromeClientHostApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void create(int? instanceId, int? webViewClientInstanceId) =>
+      super.noSuchMethod(
+          Invocation.method(#create, [instanceId, webViewClientInstanceId]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [TestWebSettingsHostApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockTestWebSettingsHostApi extends _i1.Mock
+    implements _i3.TestWebSettingsHostApi {
+  MockTestWebSettingsHostApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void create(int? instanceId, int? webViewInstanceId) => super.noSuchMethod(
+      Invocation.method(#create, [instanceId, webViewInstanceId]),
+      returnValueForMissingStub: null);
+  @override
+  void dispose(int? instanceId) =>
+      super.noSuchMethod(Invocation.method(#dispose, [instanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void setDomStorageEnabled(int? instanceId, bool? flag) => super.noSuchMethod(
+      Invocation.method(#setDomStorageEnabled, [instanceId, flag]),
+      returnValueForMissingStub: null);
+  @override
+  void setJavaScriptCanOpenWindowsAutomatically(int? instanceId, bool? flag) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #setJavaScriptCanOpenWindowsAutomatically, [instanceId, flag]),
+          returnValueForMissingStub: null);
+  @override
+  void setSupportMultipleWindows(int? instanceId, bool? support) =>
+      super.noSuchMethod(
+          Invocation.method(#setSupportMultipleWindows, [instanceId, support]),
+          returnValueForMissingStub: null);
+  @override
+  void setJavaScriptEnabled(int? instanceId, bool? flag) => super.noSuchMethod(
+      Invocation.method(#setJavaScriptEnabled, [instanceId, flag]),
+      returnValueForMissingStub: null);
+  @override
+  void setUserAgentString(int? instanceId, String? userAgentString) =>
+      super.noSuchMethod(
+          Invocation.method(#setUserAgentString, [instanceId, userAgentString]),
+          returnValueForMissingStub: null);
+  @override
+  void setMediaPlaybackRequiresUserGesture(int? instanceId, bool? require) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #setMediaPlaybackRequiresUserGesture, [instanceId, require]),
+          returnValueForMissingStub: null);
+  @override
+  void setSupportZoom(int? instanceId, bool? support) => super.noSuchMethod(
+      Invocation.method(#setSupportZoom, [instanceId, support]),
+      returnValueForMissingStub: null);
+  @override
+  void setLoadWithOverviewMode(int? instanceId, bool? overview) =>
+      super.noSuchMethod(
+          Invocation.method(#setLoadWithOverviewMode, [instanceId, overview]),
+          returnValueForMissingStub: null);
+  @override
+  void setUseWideViewPort(int? instanceId, bool? use) => super.noSuchMethod(
+      Invocation.method(#setUseWideViewPort, [instanceId, use]),
+      returnValueForMissingStub: null);
+  @override
+  void setDisplayZoomControls(int? instanceId, bool? enabled) =>
+      super.noSuchMethod(
+          Invocation.method(#setDisplayZoomControls, [instanceId, enabled]),
+          returnValueForMissingStub: null);
+  @override
+  void setBuiltInZoomControls(int? instanceId, bool? enabled) =>
+      super.noSuchMethod(
+          Invocation.method(#setBuiltInZoomControls, [instanceId, enabled]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [TestWebViewClientHostApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockTestWebViewClientHostApi extends _i1.Mock
+    implements _i3.TestWebViewClientHostApi {
+  MockTestWebViewClientHostApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void create(int? instanceId, bool? shouldOverrideUrlLoading) =>
+      super.noSuchMethod(
+          Invocation.method(#create, [instanceId, shouldOverrideUrlLoading]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [TestWebViewHostApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockTestWebViewHostApi extends _i1.Mock
+    implements _i3.TestWebViewHostApi {
+  MockTestWebViewHostApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void create(int? instanceId, bool? useHybridComposition) =>
+      super.noSuchMethod(
+          Invocation.method(#create, [instanceId, useHybridComposition]),
+          returnValueForMissingStub: null);
+  @override
+  void dispose(int? instanceId) =>
+      super.noSuchMethod(Invocation.method(#dispose, [instanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void loadUrl(int? instanceId, String? url, Map<String?, String?>? headers) =>
+      super.noSuchMethod(
+          Invocation.method(#loadUrl, [instanceId, url, headers]),
+          returnValueForMissingStub: null);
+  @override
+  String getUrl(int? instanceId) =>
+      (super.noSuchMethod(Invocation.method(#getUrl, [instanceId]),
+          returnValue: '') as String);
+  @override
+  bool canGoBack(int? instanceId) =>
+      (super.noSuchMethod(Invocation.method(#canGoBack, [instanceId]),
+          returnValue: false) as bool);
+  @override
+  bool canGoForward(int? instanceId) =>
+      (super.noSuchMethod(Invocation.method(#canGoForward, [instanceId]),
+          returnValue: false) as bool);
+  @override
+  void goBack(int? instanceId) =>
+      super.noSuchMethod(Invocation.method(#goBack, [instanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void goForward(int? instanceId) =>
+      super.noSuchMethod(Invocation.method(#goForward, [instanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void reload(int? instanceId) =>
+      super.noSuchMethod(Invocation.method(#reload, [instanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void clearCache(int? instanceId, bool? includeDiskFiles) =>
+      super.noSuchMethod(
+          Invocation.method(#clearCache, [instanceId, includeDiskFiles]),
+          returnValueForMissingStub: null);
+  @override
+  _i4.Future<String> evaluateJavascript(
+          int? instanceId, String? javascriptString) =>
+      (super.noSuchMethod(
+          Invocation.method(
+              #evaluateJavascript, [instanceId, javascriptString]),
+          returnValue: Future<String>.value('')) as _i4.Future<String>);
+  @override
+  String getTitle(int? instanceId) =>
+      (super.noSuchMethod(Invocation.method(#getTitle, [instanceId]),
+          returnValue: '') as String);
+  @override
+  void scrollTo(int? instanceId, int? x, int? y) =>
+      super.noSuchMethod(Invocation.method(#scrollTo, [instanceId, x, y]),
+          returnValueForMissingStub: null);
+  @override
+  void scrollBy(int? instanceId, int? x, int? y) =>
+      super.noSuchMethod(Invocation.method(#scrollBy, [instanceId, x, y]),
+          returnValueForMissingStub: null);
+  @override
+  int getScrollX(int? instanceId) =>
+      (super.noSuchMethod(Invocation.method(#getScrollX, [instanceId]),
+          returnValue: 0) as int);
+  @override
+  int getScrollY(int? instanceId) =>
+      (super.noSuchMethod(Invocation.method(#getScrollY, [instanceId]),
+          returnValue: 0) as int);
+  @override
+  void setWebContentsDebuggingEnabled(bool? enabled) => super.noSuchMethod(
+      Invocation.method(#setWebContentsDebuggingEnabled, [enabled]),
+      returnValueForMissingStub: null);
+  @override
+  void setWebViewClient(int? instanceId, int? webViewClientInstanceId) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #setWebViewClient, [instanceId, webViewClientInstanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void addJavaScriptChannel(
+          int? instanceId, int? javaScriptChannelInstanceId) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #addJavaScriptChannel, [instanceId, javaScriptChannelInstanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void removeJavaScriptChannel(
+          int? instanceId, int? javaScriptChannelInstanceId) =>
+      super.noSuchMethod(
+          Invocation.method(#removeJavaScriptChannel,
+              [instanceId, javaScriptChannelInstanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void setDownloadListener(int? instanceId, int? listenerInstanceId) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #setDownloadListener, [instanceId, listenerInstanceId]),
+          returnValueForMissingStub: null);
+  @override
+  void setWebChromeClient(int? instanceId, int? clientInstanceId) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #setWebChromeClient, [instanceId, clientInstanceId]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [WebChromeClient].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockWebChromeClient extends _i1.Mock implements _i2.WebChromeClient {
+  MockWebChromeClient() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  void onProgressChanged(_i2.WebView? webView, int? progress) => super
+      .noSuchMethod(Invocation.method(#onProgressChanged, [webView, progress]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [WebView].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockWebView extends _i1.Mock implements _i2.WebView {
+  MockWebView() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  bool get useHybridComposition =>
+      (super.noSuchMethod(Invocation.getter(#useHybridComposition),
+          returnValue: false) as bool);
+  @override
+  _i2.WebSettings get settings =>
+      (super.noSuchMethod(Invocation.getter(#settings),
+          returnValue: _FakeWebSettings_0()) as _i2.WebSettings);
+  @override
+  _i4.Future<void> loadUrl(String? url, Map<String, String>? headers) =>
+      (super.noSuchMethod(Invocation.method(#loadUrl, [url, headers]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<String?> getUrl() =>
+      (super.noSuchMethod(Invocation.method(#getUrl, []),
+          returnValue: Future<String?>.value()) as _i4.Future<String?>);
+  @override
+  _i4.Future<bool> canGoBack() =>
+      (super.noSuchMethod(Invocation.method(#canGoBack, []),
+          returnValue: Future<bool>.value(false)) as _i4.Future<bool>);
+  @override
+  _i4.Future<bool> canGoForward() =>
+      (super.noSuchMethod(Invocation.method(#canGoForward, []),
+          returnValue: Future<bool>.value(false)) as _i4.Future<bool>);
+  @override
+  _i4.Future<void> goBack() =>
+      (super.noSuchMethod(Invocation.method(#goBack, []),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> goForward() =>
+      (super.noSuchMethod(Invocation.method(#goForward, []),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> reload() =>
+      (super.noSuchMethod(Invocation.method(#reload, []),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> clearCache(bool? includeDiskFiles) =>
+      (super.noSuchMethod(Invocation.method(#clearCache, [includeDiskFiles]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<String?> evaluateJavascript(String? javascriptString) => (super
+      .noSuchMethod(Invocation.method(#evaluateJavascript, [javascriptString]),
+          returnValue: Future<String?>.value()) as _i4.Future<String?>);
+  @override
+  _i4.Future<String?> getTitle() =>
+      (super.noSuchMethod(Invocation.method(#getTitle, []),
+          returnValue: Future<String?>.value()) as _i4.Future<String?>);
+  @override
+  _i4.Future<void> scrollTo(int? x, int? y) =>
+      (super.noSuchMethod(Invocation.method(#scrollTo, [x, y]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> scrollBy(int? x, int? y) =>
+      (super.noSuchMethod(Invocation.method(#scrollBy, [x, y]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<int> getScrollX() =>
+      (super.noSuchMethod(Invocation.method(#getScrollX, []),
+          returnValue: Future<int>.value(0)) as _i4.Future<int>);
+  @override
+  _i4.Future<int> getScrollY() =>
+      (super.noSuchMethod(Invocation.method(#getScrollY, []),
+          returnValue: Future<int>.value(0)) as _i4.Future<int>);
+  @override
+  _i4.Future<void> setWebViewClient(_i2.WebViewClient? webViewClient) =>
+      (super.noSuchMethod(Invocation.method(#setWebViewClient, [webViewClient]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> addJavaScriptChannel(
+          _i2.JavaScriptChannel? javaScriptChannel) =>
+      (super.noSuchMethod(
+          Invocation.method(#addJavaScriptChannel, [javaScriptChannel]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> removeJavaScriptChannel(
+          _i2.JavaScriptChannel? javaScriptChannel) =>
+      (super.noSuchMethod(
+          Invocation.method(#removeJavaScriptChannel, [javaScriptChannel]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> setDownloadListener(_i2.DownloadListener? listener) =>
+      (super.noSuchMethod(Invocation.method(#setDownloadListener, [listener]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> setWebChromeClient(_i2.WebChromeClient? client) =>
+      (super.noSuchMethod(Invocation.method(#setWebChromeClient, [client]),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  _i4.Future<void> release() =>
+      (super.noSuchMethod(Invocation.method(#release, []),
+          returnValue: Future<void>.value(),
+          returnValueForMissingStub: Future<void>.value()) as _i4.Future<void>);
+  @override
+  String toString() => super.toString();
+}
+
+/// A class which mocks [WebViewClient].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockWebViewClient extends _i1.Mock implements _i2.WebViewClient {
+  MockWebViewClient() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  bool get shouldOverrideUrlLoading =>
+      (super.noSuchMethod(Invocation.getter(#shouldOverrideUrlLoading),
+          returnValue: false) as bool);
+  @override
+  void onPageStarted(_i2.WebView? webView, String? url) =>
+      super.noSuchMethod(Invocation.method(#onPageStarted, [webView, url]),
+          returnValueForMissingStub: null);
+  @override
+  void onPageFinished(_i2.WebView? webView, String? url) =>
+      super.noSuchMethod(Invocation.method(#onPageFinished, [webView, url]),
+          returnValueForMissingStub: null);
+  @override
+  void onReceivedRequestError(_i2.WebView? webView,
+          _i2.WebResourceRequest? request, _i2.WebResourceError? error) =>
+      super.noSuchMethod(
+          Invocation.method(#onReceivedRequestError, [webView, request, error]),
+          returnValueForMissingStub: null);
+  @override
+  void onReceivedError(_i2.WebView? webView, int? errorCode,
+          String? description, String? failingUrl) =>
+      super.noSuchMethod(
+          Invocation.method(
+              #onReceivedError, [webView, errorCode, description, failingUrl]),
+          returnValueForMissingStub: null);
+  @override
+  void requestLoading(_i2.WebView? webView, _i2.WebResourceRequest? request) =>
+      super.noSuchMethod(Invocation.method(#requestLoading, [webView, request]),
+          returnValueForMissingStub: null);
+  @override
+  void urlLoading(_i2.WebView? webView, String? url) =>
+      super.noSuchMethod(Invocation.method(#urlLoading, [webView, url]),
+          returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}