diff --git a/packages/file_selector/file_selector_ios/CHANGELOG.md b/packages/file_selector/file_selector_ios/CHANGELOG.md
index 9c80f0b..568b6ce 100644
--- a/packages/file_selector/file_selector_ios/CHANGELOG.md
+++ b/packages/file_selector/file_selector_ios/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 0.5.1+3
 
+* Updates pigeon to fix warnings with clang 15.
 * Updates minimum Flutter version to 3.3.
 
 ## 0.5.1+2
diff --git a/packages/file_selector/file_selector_ios/ios/Classes/messages.g.h b/packages/file_selector/file_selector_ios/ios/Classes/messages.g.h
index bcca1d9..bbaca5b 100644
--- a/packages/file_selector/file_selector_ios/ios/Classes/messages.g.h
+++ b/packages/file_selector/file_selector_ios/ios/Classes/messages.g.h
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
diff --git a/packages/file_selector/file_selector_ios/ios/Classes/messages.g.m b/packages/file_selector/file_selector_ios/ios/Classes/messages.g.m
index 9d31772..8a4ee26 100644
--- a/packages/file_selector/file_selector_ios/ios/Classes/messages.g.m
+++ b/packages/file_selector/file_selector_ios/ios/Classes/messages.g.m
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "messages.g.h"
@@ -94,7 +94,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FFSFileSelectorApiGetCodec() {
+NSObject<FlutterMessageCodec> *FFSFileSelectorApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
diff --git a/packages/file_selector/file_selector_ios/lib/src/messages.g.dart b/packages/file_selector/file_selector_ios/lib/src/messages.g.dart
index 2f38a68..c623de7 100644
--- a/packages/file_selector/file_selector_ios/lib/src/messages.g.dart
+++ b/packages/file_selector/file_selector_ios/lib/src/messages.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 
diff --git a/packages/file_selector/file_selector_ios/pubspec.yaml b/packages/file_selector/file_selector_ios/pubspec.yaml
index eb9dd24..aa94300 100644
--- a/packages/file_selector/file_selector_ios/pubspec.yaml
+++ b/packages/file_selector/file_selector_ios/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS implementation of the file_selector plugin.
 repository: https://github.com/flutter/packages/tree/main/packages/file_selector/file_selector_ios
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22
-version: 0.5.1+2
+version: 0.5.1+3
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -26,4 +26,4 @@
   flutter_test:
     sdk: flutter
   mockito: 5.4.0
-  pigeon: ^9.1.0
+  pigeon: ^9.2.4
diff --git a/packages/file_selector/file_selector_ios/test/test_api.g.dart b/packages/file_selector/file_selector_ios/test/test_api.g.dart
index cf49eb1..5648f26 100644
--- a/packages/file_selector/file_selector_ios/test/test_api.g.dart
+++ b/packages/file_selector/file_selector_ios/test/test_api.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 // ignore_for_file: avoid_relative_lib_imports
@@ -37,6 +37,8 @@
 }
 
 abstract class TestFileSelectorApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = _TestFileSelectorApiCodec();
 
   Future<List<String?>> openFile(FileSelectorConfig config);
@@ -48,9 +50,12 @@
           'dev.flutter.pigeon.FileSelectorApi.openFile', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.FileSelectorApi.openFile was null.');
           final List<Object?> args = (message as List<Object?>?)!;
diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md
index b47de94..5a3bb7f 100644
--- a/packages/image_picker/image_picker_ios/CHANGELOG.md
+++ b/packages/image_picker/image_picker_ios/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 0.8.7+3
 
+* Updates pigeon to fix warnings with clang 15.
 * Updates minimum Flutter version to 3.3.
 
 ## 0.8.7+2
diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h
index 677b491..cdde03d 100644
--- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h
+++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.h
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
diff --git a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m
index 549e647..a1d8636 100644
--- a/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m
+++ b/packages/image_picker/image_picker_ios/ios/Classes/messages.g.m
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "messages.g.h"
@@ -126,7 +126,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FLTImagePickerApiGetCodec() {
+NSObject<FlutterMessageCodec> *FLTImagePickerApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
diff --git a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart
index f999ddf..87596b7 100644
--- a/packages/image_picker/image_picker_ios/lib/src/messages.g.dart
+++ b/packages/image_picker/image_picker_ios/lib/src/messages.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 
diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml
index 3a06f8a..8665e93 100755
--- a/packages/image_picker/image_picker_ios/pubspec.yaml
+++ b/packages/image_picker/image_picker_ios/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS implementation of the image_picker plugin.
 repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_ios
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22
-version: 0.8.7+2
+version: 0.8.7+3
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -25,4 +25,4 @@
   flutter_test:
     sdk: flutter
   mockito: 5.4.0
-  pigeon: ^9.1.0
+  pigeon: ^9.2.4
diff --git a/packages/image_picker/image_picker_ios/test/test_api.g.dart b/packages/image_picker/image_picker_ios/test/test_api.g.dart
index b14b581..4ac6195 100644
--- a/packages/image_picker/image_picker_ios/test/test_api.g.dart
+++ b/packages/image_picker/image_picker_ios/test/test_api.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.1.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 // ignore_for_file: avoid_relative_lib_imports
@@ -42,6 +42,8 @@
 }
 
 abstract class TestHostImagePickerApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = _TestHostImagePickerApiCodec();
 
   Future<String?> pickImage(SourceSpecification source, MaxSize maxSize,
@@ -60,9 +62,12 @@
           'dev.flutter.pigeon.ImagePickerApi.pickImage', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.ImagePickerApi.pickImage was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -88,9 +93,12 @@
           'dev.flutter.pigeon.ImagePickerApi.pickMultiImage', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.ImagePickerApi.pickMultiImage was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -112,9 +120,12 @@
           'dev.flutter.pigeon.ImagePickerApi.pickVideo', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.ImagePickerApi.pickVideo was null.');
           final List<Object?> args = (message as List<Object?>?)!;
diff --git a/packages/url_launcher/url_launcher_ios/CHANGELOG.md b/packages/url_launcher/url_launcher_ios/CHANGELOG.md
index 0af8882..98fb8a4 100644
--- a/packages/url_launcher/url_launcher_ios/CHANGELOG.md
+++ b/packages/url_launcher/url_launcher_ios/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 6.1.4
+
+* Updates pigeon to fix warnings with clang 15.
+
 ## 6.1.3
 
 * Switches to Pigeon for internal implementation.
diff --git a/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.h b/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.h
index 9208920..3a63e07 100644
--- a/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.h
+++ b/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.h
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.0.7), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
diff --git a/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.m b/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.m
index 5c655bd..4a38efb 100644
--- a/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.m
+++ b/packages/url_launcher/url_launcher_ios/ios/Classes/messages.g.m
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.0.7), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "messages.g.h"
@@ -24,7 +24,7 @@
   return (result == [NSNull null]) ? nil : result;
 }
 
-NSObject<FlutterMessageCodec> *FULUrlLauncherApiGetCodec() {
+NSObject<FlutterMessageCodec> *FULUrlLauncherApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
diff --git a/packages/url_launcher/url_launcher_ios/lib/src/messages.g.dart b/packages/url_launcher/url_launcher_ios/lib/src/messages.g.dart
index 43ec1ed..562a408 100644
--- a/packages/url_launcher/url_launcher_ios/lib/src/messages.g.dart
+++ b/packages/url_launcher/url_launcher_ios/lib/src/messages.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v9.0.7), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 
diff --git a/packages/url_launcher/url_launcher_ios/pubspec.yaml b/packages/url_launcher/url_launcher_ios/pubspec.yaml
index 4820868..9062954 100644
--- a/packages/url_launcher/url_launcher_ios/pubspec.yaml
+++ b/packages/url_launcher/url_launcher_ios/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS implementation of the url_launcher plugin.
 repository: https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_ios
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22
-version: 6.1.3
+version: 6.1.4
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -24,6 +24,6 @@
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  pigeon: ^9.0.7
+  pigeon: ^9.2.4
   plugin_platform_interface: ^2.0.0
   test: ^1.16.3
diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md
index ef73b92..8c1e2bc 100644
--- a/packages/video_player/video_player_avfoundation/CHANGELOG.md
+++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.4.4
+
+* Updates pigeon to fix warnings with clang 15.
+
 ## 2.4.3
 
 * Synchronizes `VideoPlayerValue.isPlaying` with `AVPlayer`.
diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.h b/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.h
index f515284..19db3e9 100644
--- a/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.h
+++ b/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.h
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v8.0.0), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.m b/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.m
index 23cc2b5..12bc5c7 100644
--- a/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.m
+++ b/packages/video_player/video_player_avfoundation/ios/Classes/messages.g.m
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v8.0.0), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "messages.g.h"
@@ -319,7 +319,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FLTAVFoundationVideoPlayerApiGetCodec() {
+NSObject<FlutterMessageCodec> *FLTAVFoundationVideoPlayerApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
diff --git a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart
index acc5927..c283aee 100644
--- a/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart
+++ b/packages/video_player/video_player_avfoundation/lib/src/messages.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v8.0.0), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 
diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml
index 6cb0565..c579ee0 100644
--- a/packages/video_player/video_player_avfoundation/pubspec.yaml
+++ b/packages/video_player/video_player_avfoundation/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS implementation of the video_player plugin.
 repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22
-version: 2.4.3
+version: 2.4.4
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -24,4 +24,4 @@
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  pigeon: ^8.0.0
+  pigeon: ^9.2.4
diff --git a/packages/video_player/video_player_avfoundation/test/test_api.g.dart b/packages/video_player/video_player_avfoundation/test/test_api.g.dart
index 750ddee..bdfb356 100644
--- a/packages/video_player/video_player_avfoundation/test/test_api.g.dart
+++ b/packages/video_player/video_player_avfoundation/test/test_api.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v8.0.0), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 // ignore_for_file: avoid_relative_lib_imports
@@ -67,6 +67,8 @@
 }
 
 abstract class TestHostVideoPlayerApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = _TestHostVideoPlayerApiCodec();
 
   void initialize();
@@ -98,9 +100,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.initialize', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           // ignore message
           api.initialize();
           return <Object?>[];
@@ -112,9 +117,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.create', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -131,9 +139,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.dispose', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.dispose was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -150,9 +161,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.setLooping', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.setLooping was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -169,9 +183,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.setVolume', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.setVolume was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -189,9 +206,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.setPlaybackSpeed was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -209,9 +229,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.play', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.play was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -228,9 +251,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.position', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.position was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -247,9 +273,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.seekTo', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.seekTo was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -266,9 +295,12 @@
           'dev.flutter.pigeon.AVFoundationVideoPlayerApi.pause', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.pause was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -286,9 +318,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.AVFoundationVideoPlayerApi.setMixWithOthers was null.');
           final List<Object?> args = (message as List<Object?>?)!;
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index 4e3ac07..bfce209 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 3.2.4
 
+* Updates pigeon to fix warnings with clang 15.
 * Updates minimum Flutter version to 3.3.
 * Fixes common typos in tests and documentation.
 
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWebViewFlutterPlugin.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWebViewFlutterPlugin.m
index 5795018..6233a4e 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWebViewFlutterPlugin.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWebViewFlutterPlugin.m
@@ -60,7 +60,7 @@
 
         dispatch_async(dispatch_get_main_queue(), ^{
           [objectApi disposeObjectWithIdentifier:@(identifier)
-                                      completion:^(NSError *error) {
+                                      completion:^(FlutterError *error) {
                                         NSAssert(!error, @"%@", error);
                                       }];
         });
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h
index be5fb9f..0ebb402 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
@@ -408,7 +408,7 @@
 @interface FWFWKWebViewConfigurationFlutterApi : NSObject
 - (instancetype)initWithBinaryMessenger:(id<FlutterBinaryMessenger>)binaryMessenger;
 - (void)createWithIdentifier:(NSNumber *)identifier
-                  completion:(void (^)(NSError *_Nullable))completion;
+                  completion:(void (^)(FlutterError *_Nullable))completion;
 @end
 
 /// The codec used by FWFWKUserContentControllerHostApi.
@@ -487,7 +487,8 @@
 - (void)didReceiveScriptMessageForHandlerWithIdentifier:(NSNumber *)identifier
                         userContentControllerIdentifier:(NSNumber *)userContentControllerIdentifier
                                                 message:(FWFWKScriptMessageData *)message
-                                             completion:(void (^)(NSError *_Nullable))completion;
+                                             completion:
+                                                 (void (^)(FlutterError *_Nullable))completion;
 @end
 
 /// The codec used by FWFWKNavigationDelegateHostApi.
@@ -515,12 +516,12 @@
 - (void)didFinishNavigationForDelegateWithIdentifier:(NSNumber *)identifier
                                    webViewIdentifier:(NSNumber *)webViewIdentifier
                                                  URL:(nullable NSString *)url
-                                          completion:(void (^)(NSError *_Nullable))completion;
+                                          completion:(void (^)(FlutterError *_Nullable))completion;
 - (void)didStartProvisionalNavigationForDelegateWithIdentifier:(NSNumber *)identifier
                                              webViewIdentifier:(NSNumber *)webViewIdentifier
                                                            URL:(nullable NSString *)url
-                                                    completion:
-                                                        (void (^)(NSError *_Nullable))completion;
+                                                    completion:(void (^)(FlutterError *_Nullable))
+                                                                   completion;
 - (void)
     decidePolicyForNavigationActionForDelegateWithIdentifier:(NSNumber *)identifier
                                            webViewIdentifier:(NSNumber *)webViewIdentifier
@@ -529,20 +530,21 @@
                                                   completion:
                                                       (void (^)(FWFWKNavigationActionPolicyEnumData
                                                                     *_Nullable,
-                                                                NSError *_Nullable))completion;
+                                                                FlutterError *_Nullable))completion;
 - (void)didFailNavigationForDelegateWithIdentifier:(NSNumber *)identifier
                                  webViewIdentifier:(NSNumber *)webViewIdentifier
                                              error:(FWFNSErrorData *)error
-                                        completion:(void (^)(NSError *_Nullable))completion;
+                                        completion:(void (^)(FlutterError *_Nullable))completion;
 - (void)didFailProvisionalNavigationForDelegateWithIdentifier:(NSNumber *)identifier
                                             webViewIdentifier:(NSNumber *)webViewIdentifier
                                                         error:(FWFNSErrorData *)error
-                                                   completion:
-                                                       (void (^)(NSError *_Nullable))completion;
+                                                   completion:(void (^)(FlutterError *_Nullable))
+                                                                  completion;
 - (void)webViewWebContentProcessDidTerminateForDelegateWithIdentifier:(NSNumber *)identifier
                                                     webViewIdentifier:(NSNumber *)webViewIdentifier
-                                                           completion:(void (^)(NSError *_Nullable))
-                                                                          completion;
+                                                           completion:
+                                                               (void (^)(FlutterError *_Nullable))
+                                                                   completion;
 @end
 
 /// The codec used by FWFNSObjectHostApi.
@@ -582,9 +584,9 @@
                            objectIdentifier:(NSNumber *)objectIdentifier
                                  changeKeys:(NSArray<FWFNSKeyValueChangeKeyEnumData *> *)changeKeys
                                changeValues:(NSArray<id> *)changeValues
-                                 completion:(void (^)(NSError *_Nullable))completion;
+                                 completion:(void (^)(FlutterError *_Nullable))completion;
 - (void)disposeObjectWithIdentifier:(NSNumber *)identifier
-                         completion:(void (^)(NSError *_Nullable))completion;
+                         completion:(void (^)(FlutterError *_Nullable))completion;
 @end
 
 /// The codec used by FWFWKWebViewHostApi.
@@ -679,7 +681,7 @@
                                webViewIdentifier:(NSNumber *)webViewIdentifier
                          configurationIdentifier:(NSNumber *)configurationIdentifier
                                 navigationAction:(FWFWKNavigationActionData *)navigationAction
-                                      completion:(void (^)(NSError *_Nullable))completion;
+                                      completion:(void (^)(FlutterError *_Nullable))completion;
 @end
 
 /// The codec used by FWFWKHttpCookieStoreHostApi.
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m
index 7f4bcef..957a4de 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "FWFGeneratedWebKitApis.h"
@@ -507,7 +507,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKWebsiteDataStoreHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKWebsiteDataStoreHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -598,7 +598,7 @@
     }
   }
 }
-NSObject<FlutterMessageCodec> *FWFUIViewHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFUIViewHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -652,7 +652,7 @@
     }
   }
 }
-NSObject<FlutterMessageCodec> *FWFUIScrollViewHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFUIScrollViewHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -795,7 +795,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKWebViewConfigurationHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKWebViewConfigurationHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -910,7 +910,7 @@
     }
   }
 }
-NSObject<FlutterMessageCodec> *FWFWKWebViewConfigurationFlutterApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKWebViewConfigurationFlutterApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -930,7 +930,7 @@
   return self;
 }
 - (void)createWithIdentifier:(NSNumber *)arg_identifier
-                  completion:(void (^)(NSError *_Nullable))completion {
+                  completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.WKWebViewConfigurationFlutterApi.create"
              binaryMessenger:self.binaryMessenger
@@ -984,7 +984,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKUserContentControllerHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKUserContentControllerHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -1150,7 +1150,7 @@
     }
   }
 }
-NSObject<FlutterMessageCodec> *FWFWKPreferencesHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKPreferencesHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -1210,7 +1210,7 @@
     }
   }
 }
-NSObject<FlutterMessageCodec> *FWFWKScriptMessageHandlerHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKScriptMessageHandlerHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -1277,7 +1277,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKScriptMessageHandlerFlutterApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKScriptMessageHandlerFlutterApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -1301,11 +1301,11 @@
   }
   return self;
 }
-- (void)didReceiveScriptMessageForHandlerWithIdentifier:(NSNumber *)arg_identifier
-                        userContentControllerIdentifier:
-                            (NSNumber *)arg_userContentControllerIdentifier
-                                                message:(FWFWKScriptMessageData *)arg_message
-                                             completion:(void (^)(NSError *_Nullable))completion {
+- (void)
+    didReceiveScriptMessageForHandlerWithIdentifier:(NSNumber *)arg_identifier
+                    userContentControllerIdentifier:(NSNumber *)arg_userContentControllerIdentifier
+                                            message:(FWFWKScriptMessageData *)arg_message
+                                         completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.WKScriptMessageHandlerFlutterApi.didReceiveScriptMessage"
@@ -1321,7 +1321,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKNavigationDelegateHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKNavigationDelegateHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -1408,7 +1408,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKNavigationDelegateFlutterApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKNavigationDelegateFlutterApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -1435,7 +1435,7 @@
 - (void)didFinishNavigationForDelegateWithIdentifier:(NSNumber *)arg_identifier
                                    webViewIdentifier:(NSNumber *)arg_webViewIdentifier
                                                  URL:(nullable NSString *)arg_url
-                                          completion:(void (^)(NSError *_Nullable))completion {
+                                          completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFinishNavigation"
@@ -1452,8 +1452,8 @@
 - (void)didStartProvisionalNavigationForDelegateWithIdentifier:(NSNumber *)arg_identifier
                                              webViewIdentifier:(NSNumber *)arg_webViewIdentifier
                                                            URL:(nullable NSString *)arg_url
-                                                    completion:
-                                                        (void (^)(NSError *_Nullable))completion {
+                                                    completion:(void (^)(FlutterError *_Nullable))
+                                                                   completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didStartProvisionalNavigation"
@@ -1467,15 +1467,15 @@
                    completion(nil);
                  }];
 }
-- (void)
-    decidePolicyForNavigationActionForDelegateWithIdentifier:(NSNumber *)arg_identifier
-                                           webViewIdentifier:(NSNumber *)arg_webViewIdentifier
-                                            navigationAction:
-                                                (FWFWKNavigationActionData *)arg_navigationAction
-                                                  completion:
-                                                      (void (^)(FWFWKNavigationActionPolicyEnumData
-                                                                    *_Nullable,
-                                                                NSError *_Nullable))completion {
+- (void)decidePolicyForNavigationActionForDelegateWithIdentifier:(NSNumber *)arg_identifier
+                                               webViewIdentifier:(NSNumber *)arg_webViewIdentifier
+                                                navigationAction:(FWFWKNavigationActionData *)
+                                                                     arg_navigationAction
+                                                      completion:
+                                                          (void (^)(
+                                                              FWFWKNavigationActionPolicyEnumData
+                                                                  *_Nullable,
+                                                              FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationAction"
@@ -1493,7 +1493,7 @@
 - (void)didFailNavigationForDelegateWithIdentifier:(NSNumber *)arg_identifier
                                  webViewIdentifier:(NSNumber *)arg_webViewIdentifier
                                              error:(FWFNSErrorData *)arg_error
-                                        completion:(void (^)(NSError *_Nullable))completion {
+                                        completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFailNavigation"
              binaryMessenger:self.binaryMessenger
@@ -1509,8 +1509,8 @@
 - (void)didFailProvisionalNavigationForDelegateWithIdentifier:(NSNumber *)arg_identifier
                                             webViewIdentifier:(NSNumber *)arg_webViewIdentifier
                                                         error:(FWFNSErrorData *)arg_error
-                                                   completion:
-                                                       (void (^)(NSError *_Nullable))completion {
+                                                   completion:(void (^)(FlutterError *_Nullable))
+                                                                  completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFailProvisionalNavigation"
@@ -1527,8 +1527,9 @@
 - (void)webViewWebContentProcessDidTerminateForDelegateWithIdentifier:(NSNumber *)arg_identifier
                                                     webViewIdentifier:
                                                         (NSNumber *)arg_webViewIdentifier
-                                                           completion:(void (^)(NSError *_Nullable))
-                                                                          completion {
+                                                           completion:
+                                                               (void (^)(FlutterError *_Nullable))
+                                                                   completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.webViewWebContentProcessDidTerminate"
@@ -1578,7 +1579,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFNSObjectHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFNSObjectHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -1775,7 +1776,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFNSObjectFlutterApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFNSObjectFlutterApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -1805,7 +1806,7 @@
                                  changeKeys:
                                      (NSArray<FWFNSKeyValueChangeKeyEnumData *> *)arg_changeKeys
                                changeValues:(NSArray<id> *)arg_changeValues
-                                 completion:(void (^)(NSError *_Nullable))completion {
+                                 completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.NSObjectFlutterApi.observeValue"
              binaryMessenger:self.binaryMessenger
@@ -1820,7 +1821,7 @@
                  }];
 }
 - (void)disposeObjectWithIdentifier:(NSNumber *)arg_identifier
-                         completion:(void (^)(NSError *_Nullable))completion {
+                         completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.NSObjectFlutterApi.dispose"
              binaryMessenger:self.binaryMessenger
@@ -1934,7 +1935,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKWebViewHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKWebViewHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -2372,7 +2373,7 @@
     }
   }
 }
-NSObject<FlutterMessageCodec> *FWFWKUIDelegateHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKUIDelegateHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   sSharedObject = [FlutterStandardMessageCodec sharedInstance];
   return sSharedObject;
@@ -2449,7 +2450,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKUIDelegateFlutterApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKUIDelegateFlutterApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
@@ -2477,7 +2478,7 @@
                                webViewIdentifier:(NSNumber *)arg_webViewIdentifier
                          configurationIdentifier:(NSNumber *)arg_configurationIdentifier
                                 navigationAction:(FWFWKNavigationActionData *)arg_navigationAction
-                                      completion:(void (^)(NSError *_Nullable))completion {
+                                      completion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.WKUIDelegateFlutterApi.onCreateWebView"
              binaryMessenger:self.binaryMessenger
@@ -2534,7 +2535,7 @@
 }
 @end
 
-NSObject<FlutterMessageCodec> *FWFWKHttpCookieStoreHostApiGetCodec() {
+NSObject<FlutterMessageCodec> *FWFWKHttpCookieStoreHostApiGetCodec(void) {
   static FlutterStandardMessageCodec *sSharedObject = nil;
   static dispatch_once_t sPred = 0;
   dispatch_once(&sPred, ^{
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m
index 1132e02..d9cdfd9 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m
@@ -28,7 +28,7 @@
 - (void)didFinishNavigationForDelegate:(FWFNavigationDelegate *)instance
                                webView:(WKWebView *)webView
                                    URL:(NSString *)URL
-                            completion:(void (^)(NSError *_Nullable))completion {
+                            completion:(void (^)(FlutterError *_Nullable))completion {
   NSNumber *webViewIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:webView]);
   [self didFinishNavigationForDelegateWithIdentifier:@([self identifierForDelegate:instance])
@@ -40,7 +40,7 @@
 - (void)didStartProvisionalNavigationForDelegate:(FWFNavigationDelegate *)instance
                                          webView:(WKWebView *)webView
                                              URL:(NSString *)URL
-                                      completion:(void (^)(NSError *_Nullable))completion {
+                                      completion:(void (^)(FlutterError *_Nullable))completion {
   NSNumber *webViewIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:webView]);
   [self didStartProvisionalNavigationForDelegateWithIdentifier:@([self
@@ -56,7 +56,7 @@
                               navigationAction:(WKNavigationAction *)navigationAction
                                     completion:
                                         (void (^)(FWFWKNavigationActionPolicyEnumData *_Nullable,
-                                                  NSError *_Nullable))completion {
+                                                  FlutterError *_Nullable))completion {
   NSNumber *webViewIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:webView]);
   FWFWKNavigationActionData *navigationActionData =
@@ -72,7 +72,7 @@
 - (void)didFailNavigationForDelegate:(FWFNavigationDelegate *)instance
                              webView:(WKWebView *)webView
                                error:(NSError *)error
-                          completion:(void (^)(NSError *_Nullable))completion {
+                          completion:(void (^)(FlutterError *_Nullable))completion {
   NSNumber *webViewIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:webView]);
   [self didFailNavigationForDelegateWithIdentifier:@([self identifierForDelegate:instance])
@@ -84,7 +84,7 @@
 - (void)didFailProvisionalNavigationForDelegate:(FWFNavigationDelegate *)instance
                                         webView:(WKWebView *)webView
                                           error:(NSError *)error
-                                     completion:(void (^)(NSError *_Nullable))completion {
+                                     completion:(void (^)(FlutterError *_Nullable))completion {
   NSNumber *webViewIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:webView]);
   [self
@@ -96,7 +96,8 @@
 
 - (void)webViewWebContentProcessDidTerminateForDelegate:(FWFNavigationDelegate *)instance
                                                 webView:(WKWebView *)webView
-                                             completion:(void (^)(NSError *_Nullable))completion {
+                                             completion:
+                                                 (void (^)(FlutterError *_Nullable))completion {
   NSNumber *webViewIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:webView]);
   [self webViewWebContentProcessDidTerminateForDelegateWithIdentifier:
@@ -122,7 +123,7 @@
   [self.navigationDelegateAPI didFinishNavigationForDelegate:self
                                                      webView:webView
                                                          URL:webView.URL.absoluteString
-                                                  completion:^(NSError *error) {
+                                                  completion:^(FlutterError *error) {
                                                     NSAssert(!error, @"%@", error);
                                                   }];
 }
@@ -131,7 +132,7 @@
   [self.navigationDelegateAPI didStartProvisionalNavigationForDelegate:self
                                                                webView:webView
                                                                    URL:webView.URL.absoluteString
-                                                            completion:^(NSError *error) {
+                                                            completion:^(FlutterError *error) {
                                                               NSAssert(!error, @"%@", error);
                                                             }];
 }
@@ -144,7 +145,7 @@
                                          webView:webView
                                 navigationAction:navigationAction
                                       completion:^(FWFWKNavigationActionPolicyEnumData *policy,
-                                                   NSError *error) {
+                                                   FlutterError *error) {
                                         NSAssert(!error, @"%@", error);
                                         decisionHandler(
                                             FWFWKNavigationActionPolicyFromEnumData(policy));
@@ -157,7 +158,7 @@
   [self.navigationDelegateAPI didFailNavigationForDelegate:self
                                                    webView:webView
                                                      error:error
-                                                completion:^(NSError *error) {
+                                                completion:^(FlutterError *error) {
                                                   NSAssert(!error, @"%@", error);
                                                 }];
 }
@@ -168,17 +169,18 @@
   [self.navigationDelegateAPI didFailProvisionalNavigationForDelegate:self
                                                               webView:webView
                                                                 error:error
-                                                           completion:^(NSError *error) {
+                                                           completion:^(FlutterError *error) {
                                                              NSAssert(!error, @"%@", error);
                                                            }];
 }
 
 - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
-  [self.navigationDelegateAPI webViewWebContentProcessDidTerminateForDelegate:self
-                                                                      webView:webView
-                                                                   completion:^(NSError *error) {
-                                                                     NSAssert(!error, @"%@", error);
-                                                                   }];
+  [self.navigationDelegateAPI
+      webViewWebContentProcessDidTerminateForDelegate:self
+                                              webView:webView
+                                           completion:^(FlutterError *error) {
+                                             NSAssert(!error, @"%@", error);
+                                           }];
 }
 @end
 
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.h
index 0b740a5..c1b4355 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.h
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.h
@@ -22,7 +22,7 @@
                       keyPath:(NSString *)keyPath
                        object:(NSObject *)object
                        change:(NSDictionary<NSKeyValueChangeKey, id> *)change
-                   completion:(void (^)(NSError *_Nullable))completion;
+                   completion:(void (^)(FlutterError *_Nullable))completion;
 @end
 
 /**
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.m
index c88b2f4..7da383c 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFObjectHostApi.m
@@ -28,7 +28,7 @@
                       keyPath:(NSString *)keyPath
                        object:(NSObject *)object
                        change:(NSDictionary<NSKeyValueChangeKey, id> *)change
-                   completion:(void (^)(NSError *_Nullable))completion {
+                   completion:(void (^)(FlutterError *_Nullable))completion {
   NSMutableArray<FWFNSKeyValueChangeKeyEnumData *> *changeKeys = [NSMutableArray array];
   NSMutableArray<id> *changeValues = [NSMutableArray array];
 
@@ -67,7 +67,7 @@
                                 keyPath:keyPath
                                  object:object
                                  change:change
-                             completion:^(NSError *error) {
+                             completion:^(FlutterError *error) {
                                NSAssert(!error, @"%@", error);
                              }];
 }
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFScriptMessageHandlerHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFScriptMessageHandlerHostApi.m
index d9e8b93..fc7c309 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFScriptMessageHandlerHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFScriptMessageHandlerHostApi.m
@@ -27,7 +27,7 @@
 - (void)didReceiveScriptMessageForHandler:(FWFScriptMessageHandler *)instance
                     userContentController:(WKUserContentController *)userContentController
                                   message:(WKScriptMessage *)message
-                               completion:(void (^)(NSError *_Nullable))completion {
+                               completion:(void (^)(FlutterError *_Nullable))completion {
   NSNumber *userContentControllerIdentifier =
       @([self.instanceManager identifierWithStrongReferenceForInstance:userContentController]);
   FWFWKScriptMessageData *messageData = FWFWKScriptMessageDataFromWKScriptMessage(message);
@@ -55,7 +55,7 @@
   [self.scriptMessageHandlerAPI didReceiveScriptMessageForHandler:self
                                             userContentController:userContentController
                                                           message:message
-                                                       completion:^(NSError *error) {
+                                                       completion:^(FlutterError *error) {
                                                          NSAssert(!error, @"%@", error);
                                                        }];
 }
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFUIDelegateHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFUIDelegateHostApi.m
index 60e7ad1..a8ae512 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFUIDelegateHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFUIDelegateHostApi.m
@@ -35,10 +35,10 @@
                            webView:(WKWebView *)webView
                      configuration:(WKWebViewConfiguration *)configuration
                   navigationAction:(WKNavigationAction *)navigationAction
-                        completion:(void (^)(NSError *_Nullable))completion {
+                        completion:(void (^)(FlutterError *_Nullable))completion {
   if (![self.instanceManager containsInstance:configuration]) {
     [self.webViewConfigurationFlutterApi createWithConfiguration:configuration
-                                                      completion:^(NSError *error) {
+                                                      completion:^(FlutterError *error) {
                                                         NSAssert(!error, @"%@", error);
                                                       }];
   }
@@ -77,7 +77,7 @@
                                          webView:webView
                                    configuration:configuration
                                 navigationAction:navigationAction
-                                      completion:^(NSError *error) {
+                                      completion:^(FlutterError *error) {
                                         NSAssert(!error, @"%@", error);
                                       }];
   return nil;
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.h
index f1e62cc..363fe6a 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.h
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.h
@@ -21,7 +21,7 @@
                         instanceManager:(FWFInstanceManager *)instanceManager;
 
 - (void)createWithConfiguration:(WKWebViewConfiguration *)configuration
-                     completion:(void (^)(NSError *_Nullable))completion;
+                     completion:(void (^)(FlutterError *_Nullable))completion;
 @end
 
 /**
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m
index c51042f..8649f32 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m
@@ -22,7 +22,7 @@
 }
 
 - (void)createWithConfiguration:(WKWebViewConfiguration *)configuration
-                     completion:(void (^)(NSError *_Nullable))completion {
+                     completion:(void (^)(FlutterError *_Nullable))completion {
   long identifier = [self.instanceManager addHostCreatedInstance:configuration];
   [self createWithIdentifier:@(identifier) completion:completion];
 }
@@ -47,7 +47,7 @@
                                 keyPath:keyPath
                                  object:object
                                  change:change
-                             completion:^(NSError *error) {
+                             completion:^(FlutterError *error) {
                                NSAssert(!error, @"%@", error);
                              }];
 }
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m
index c3c2533..549657e 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m
@@ -52,7 +52,7 @@
                                 keyPath:keyPath
                                  object:object
                                  change:change
-                             completion:^(NSError *error) {
+                             completion:^(FlutterError *error) {
                                NSAssert(!error, @"%@", error);
                              }];
 }
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart
index 6682656..75d7aab 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
index 40e185d..6d32867 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
 repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 3.2.3
+version: 3.2.4
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -29,4 +29,4 @@
   flutter_test:
     sdk: flutter
   mockito: 5.4.0
-  pigeon: ^7.0.5
+  pigeon: ^9.2.4
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart
index 7f7baf6..ce6ecb6 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart
@@ -1,7 +1,7 @@
 // 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.
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v9.2.4), 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, unnecessary_import
 // ignore_for_file: avoid_relative_lib_imports
@@ -40,6 +40,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkwebsitedatastore?language=objc.
 abstract class TestWKWebsiteDataStoreHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec =
       _TestWKWebsiteDataStoreHostApiCodec();
 
@@ -61,9 +63,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebsiteDataStoreHostApi.createFromWebViewConfiguration was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -85,9 +90,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebsiteDataStoreHostApi.createDefaultDataStore was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -105,9 +113,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebsiteDataStoreHostApi.removeDataOfTypes was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -135,6 +146,8 @@
 ///
 /// See https://developer.apple.com/documentation/uikit/uiview?language=objc.
 abstract class TestUIViewHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = StandardMessageCodec();
 
   void setBackgroundColor(int identifier, int? value);
@@ -148,9 +161,12 @@
           'dev.flutter.pigeon.UIViewHostApi.setBackgroundColor', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.UIViewHostApi.setBackgroundColor was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -168,9 +184,12 @@
           'dev.flutter.pigeon.UIViewHostApi.setOpaque', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.UIViewHostApi.setOpaque was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -192,6 +211,8 @@
 ///
 /// See https://developer.apple.com/documentation/uikit/uiscrollview?language=objc.
 abstract class TestUIScrollViewHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = StandardMessageCodec();
 
   void createFromWebView(int identifier, int webViewIdentifier);
@@ -209,9 +230,12 @@
           'dev.flutter.pigeon.UIScrollViewHostApi.createFromWebView', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.UIScrollViewHostApi.createFromWebView was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -231,9 +255,12 @@
           'dev.flutter.pigeon.UIScrollViewHostApi.getContentOffset', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.UIScrollViewHostApi.getContentOffset was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -250,9 +277,12 @@
           'dev.flutter.pigeon.UIScrollViewHostApi.scrollBy', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.UIScrollViewHostApi.scrollBy was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -275,9 +305,12 @@
           'dev.flutter.pigeon.UIScrollViewHostApi.setContentOffset', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.UIScrollViewHostApi.setContentOffset was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -325,6 +358,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkwebviewconfiguration?language=objc.
 abstract class TestWKWebViewConfigurationHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec =
       _TestWKWebViewConfigurationHostApiCodec();
 
@@ -344,9 +379,12 @@
           'dev.flutter.pigeon.WKWebViewConfigurationHostApi.create', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -364,9 +402,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.createFromWebView was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -387,9 +428,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.setAllowsInlineMediaPlayback was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -410,9 +454,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.setMediaTypesRequiringUserActionForPlayback was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -465,6 +512,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkusercontentcontroller?language=objc.
 abstract class TestWKUserContentControllerHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec =
       _TestWKUserContentControllerHostApiCodec();
 
@@ -490,9 +539,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUserContentControllerHostApi.createFromWebViewConfiguration was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -514,9 +566,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUserContentControllerHostApi.addScriptMessageHandler was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -541,9 +596,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUserContentControllerHostApi.removeScriptMessageHandler was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -564,9 +622,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUserContentControllerHostApi.removeAllScriptMessageHandlers was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -584,9 +645,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUserContentControllerHostApi.addUserScript was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -608,9 +672,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUserContentControllerHostApi.removeAllUserScripts was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -629,6 +696,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkpreferences?language=objc.
 abstract class TestWKPreferencesHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = StandardMessageCodec();
 
   void createFromWebViewConfiguration(
@@ -644,9 +713,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKPreferencesHostApi.createFromWebViewConfiguration was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -667,9 +739,12 @@
           'dev.flutter.pigeon.WKPreferencesHostApi.setJavaScriptEnabled', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKPreferencesHostApi.setJavaScriptEnabled was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -691,6 +766,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkscriptmessagehandler?language=objc.
 abstract class TestWKScriptMessageHandlerHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = StandardMessageCodec();
 
   void create(int identifier);
@@ -702,9 +779,12 @@
           'dev.flutter.pigeon.WKScriptMessageHandlerHostApi.create', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKScriptMessageHandlerHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -723,6 +803,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wknavigationdelegate?language=objc.
 abstract class TestWKNavigationDelegateHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = StandardMessageCodec();
 
   void create(int identifier);
@@ -734,9 +816,12 @@
           'dev.flutter.pigeon.WKNavigationDelegateHostApi.create', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKNavigationDelegateHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -778,6 +863,8 @@
 ///
 /// See https://developer.apple.com/documentation/objectivec/nsobject.
 abstract class TestNSObjectHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = _TestNSObjectHostApiCodec();
 
   void dispose(int identifier);
@@ -794,9 +881,12 @@
           'dev.flutter.pigeon.NSObjectHostApi.dispose', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.NSObjectHostApi.dispose was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -813,9 +903,12 @@
           'dev.flutter.pigeon.NSObjectHostApi.addObserver', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.NSObjectHostApi.addObserver was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -844,9 +937,12 @@
           'dev.flutter.pigeon.NSObjectHostApi.removeObserver', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.NSObjectHostApi.removeObserver was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -960,6 +1056,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkwebview?language=objc.
 abstract class TestWKWebViewHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = _TestWKWebViewHostApiCodec();
 
   void create(int identifier, int configurationIdentifier);
@@ -1005,9 +1103,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.create', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1027,9 +1128,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.setUIDelegate', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.setUIDelegate was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1047,9 +1151,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.setNavigationDelegate', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.setNavigationDelegate was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1068,9 +1175,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.getUrl', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.getUrl was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1087,9 +1197,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.getEstimatedProgress', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.getEstimatedProgress was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1106,9 +1219,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.loadRequest', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.loadRequest was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1128,9 +1244,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.loadHtmlString', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.loadHtmlString was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1151,9 +1270,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.loadFileUrl', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.loadFileUrl was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1176,9 +1298,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.loadFlutterAsset', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.loadFlutterAsset was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1198,9 +1323,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.canGoBack', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.canGoBack was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1217,9 +1345,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.canGoForward', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.canGoForward was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1236,9 +1367,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.goBack', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.goBack was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1255,9 +1389,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.goForward', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.goForward was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1274,9 +1411,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.reload', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.reload was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1293,9 +1433,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.getTitle', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.getTitle was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1313,9 +1456,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.setAllowsBackForwardNavigationGestures was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1336,9 +1482,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.setCustomUserAgent', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.setCustomUserAgent was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1356,9 +1505,12 @@
           'dev.flutter.pigeon.WKWebViewHostApi.evaluateJavaScript', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKWebViewHostApi.evaluateJavaScript was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1381,6 +1533,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkuidelegate?language=objc.
 abstract class TestWKUIDelegateHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec = StandardMessageCodec();
 
   void create(int identifier);
@@ -1392,9 +1546,12 @@
           'dev.flutter.pigeon.WKUIDelegateHostApi.create', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKUIDelegateHostApi.create was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1441,6 +1598,8 @@
 ///
 /// See https://developer.apple.com/documentation/webkit/wkhttpcookiestore?language=objc.
 abstract class TestWKHttpCookieStoreHostApi {
+  static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding =>
+      TestDefaultBinaryMessengerBinding.instance;
   static const MessageCodec<Object?> codec =
       _TestWKHttpCookieStoreHostApiCodec();
 
@@ -1457,9 +1616,12 @@
           codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKHttpCookieStoreHostApi.createFromWebsiteDataStore was null.');
           final List<Object?> args = (message as List<Object?>?)!;
@@ -1480,9 +1642,12 @@
           'dev.flutter.pigeon.WKHttpCookieStoreHostApi.setCookie', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
-        channel.setMockMessageHandler(null);
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel, null);
       } else {
-        channel.setMockMessageHandler((Object? message) async {
+        _testBinaryMessengerBinding!.defaultBinaryMessenger
+            .setMockDecodedMessageHandler<Object?>(channel,
+                (Object? message) async {
           assert(message != null,
               'Argument for dev.flutter.pigeon.WKHttpCookieStoreHostApi.setCookie was null.');
           final List<Object?> args = (message as List<Object?>?)!;
