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();
+}
