[pigeon] Change the Obj-C error type for FlutterApi (#3182)

* Add warnings-as-errors for test code, and fix issues

* Move a file-specific Dart helper into its class

* Conditionalize an Obj-C helper

* Make the breaking change to fix the error type

* Fix typo

* More test updates
diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index a18f8f2..6a1853e 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,13 +1,19 @@
+## 8.0.0
+
+* [objc] **BREAKING CHANGE**: FlutterApi calls now return a `FlutterError`,
+  rather than an `NSError`, on failure.
+* [objc] Fixes an unused function warning when only generating FlutterApi.
+
 ## 7.2.1
 
 * [kotlin] Fixes Flutter api int errors with updated casting.
 
 ## 7.2.0
 
-* [swift] Changes async method completion types. 
+* [swift] Changes async method completion types.
   May require code updates to existing code.
 * [swift] Adds error handling to async methods.
-* [kotlin] Changes async method completion types. 
+* [kotlin] Changes async method completion types.
   May require code updates to existing code.
 * [kotlin] Adds error handling to async methods.
 * Adds async error handling integration tests for all platforms.
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 7b87c23..07277d2 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -11,7 +11,7 @@
 /// The current version of pigeon.
 ///
 /// This must match the version in pubspec.yaml.
-const String pigeonVersion = '7.2.1';
+const String pigeonVersion = '8.0.0';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart
index b9a3695..926d4ec 100644
--- a/packages/pigeon/lib/objc_generator.dart
+++ b/packages/pigeon/lib/objc_generator.dart
@@ -361,7 +361,9 @@
   @override
   void writeDataClasses(
       ObjcOptions generatorOptions, Root root, Indent indent) {
-    _writeObjcSourceHelperFunctions(indent);
+    _writeObjcSourceHelperFunctions(indent,
+        hasHostApiMethods: root.apis.any((Api api) =>
+            api.location == ApiLocation.host && api.methods.isNotEmpty));
 
     for (final Class klass in root.classes) {
       _writeObjcSourceDataClassExtension(generatorOptions, indent, klass);
@@ -643,8 +645,10 @@
     });
   }
 
-  void _writeObjcSourceHelperFunctions(Indent indent) {
-    indent.format('''
+  void _writeObjcSourceHelperFunctions(Indent indent,
+      {required bool hasHostApiMethods}) {
+    if (hasHostApiMethods) {
+      indent.format('''
 static NSArray *wrapResult(id result, FlutterError *error) {
 \tif (error) {
 \t\treturn @[
@@ -653,6 +657,7 @@
 \t}
 \treturn @[ result ?: [NSNull null] ];
 }''');
+    }
     indent.format('''
 static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
 \tid result = array[key];
@@ -795,6 +800,55 @@
       indent.writeln('return sSharedObject;');
     });
   }
+
+  void _writeMethod(ObjcOptions languageOptions, Root root, Indent indent,
+      Api api, Method func) {
+    final _ObjcPtr returnType =
+        _objcTypeForDartType(languageOptions.prefix, func.returnType);
+    final String callbackType = _callbackForType(func.returnType, returnType);
+
+    String argNameFunc(int count, NamedType arg) => _getSafeArgName(count, arg);
+    final Iterable<String> argNames = indexMap(func.arguments, argNameFunc);
+    String sendArgument;
+    if (func.arguments.isEmpty) {
+      sendArgument = 'nil';
+    } else {
+      String makeVarOrNSNullExpression(String x) => '$x ?: [NSNull null]';
+      sendArgument = '@[${argNames.map(makeVarOrNSNullExpression).join(', ')}]';
+    }
+    indent.write(_makeObjcSignature(
+      func: func,
+      options: languageOptions,
+      returnType: 'void',
+      lastArgName: 'completion',
+      lastArgType: callbackType,
+      argNameFunc: argNameFunc,
+      isEnum: (TypeDeclaration t) => isEnum(root, t),
+    ));
+    indent.addScoped(' {', '}', () {
+      indent.writeln('FlutterBasicMessageChannel *channel =');
+      indent.nest(1, () {
+        indent.writeln('[FlutterBasicMessageChannel');
+        indent.nest(1, () {
+          indent.writeln(
+              'messageChannelWithName:@"${makeChannelName(api, func)}"');
+          indent.writeln('binaryMessenger:self.binaryMessenger');
+          indent.write(
+              'codec:${_getCodecGetterName(languageOptions.prefix, api.name)}()');
+          indent.addln('];');
+        });
+      });
+      indent.write('[channel sendMessage:$sendArgument reply:^(id reply) ');
+      indent.addScoped('{', '}];', () {
+        if (func.returnType.isVoid) {
+          indent.writeln('completion(nil);');
+        } else {
+          indent.writeln('${returnType.ptr}output = reply;');
+          indent.writeln('completion(output, nil);');
+        }
+      });
+    });
+  }
 }
 
 /// Writes the method declaration for the initializer.
@@ -842,8 +896,8 @@
 /// Calculates callback block signature for for async methods.
 String _callbackForType(TypeDeclaration type, _ObjcPtr objcType) {
   return type.isVoid
-      ? 'void (^)(NSError *_Nullable)'
-      : 'void (^)(${objcType.ptr.trim()}_Nullable, NSError *_Nullable)';
+      ? 'void (^)(FlutterError *_Nullable)'
+      : 'void (^)(${objcType.ptr.trim()}_Nullable, FlutterError *_Nullable)';
 }
 
 /// Represents an ObjC pointer (ex 'id', 'NSString *').
@@ -1069,55 +1123,6 @@
   });
 }
 
-void _writeMethod(ObjcOptions languageOptions, Root root, Indent indent,
-    Api api, Method func) {
-  final _ObjcPtr returnType =
-      _objcTypeForDartType(languageOptions.prefix, func.returnType);
-  final String callbackType = _callbackForType(func.returnType, returnType);
-
-  String argNameFunc(int count, NamedType arg) => _getSafeArgName(count, arg);
-  final Iterable<String> argNames = indexMap(func.arguments, argNameFunc);
-  String sendArgument;
-  if (func.arguments.isEmpty) {
-    sendArgument = 'nil';
-  } else {
-    String makeVarOrNSNullExpression(String x) => '$x ?: [NSNull null]';
-    sendArgument = '@[${argNames.map(makeVarOrNSNullExpression).join(', ')}]';
-  }
-  indent.write(_makeObjcSignature(
-    func: func,
-    options: languageOptions,
-    returnType: 'void',
-    lastArgName: 'completion',
-    lastArgType: callbackType,
-    argNameFunc: argNameFunc,
-    isEnum: (TypeDeclaration t) => isEnum(root, t),
-  ));
-  indent.addScoped(' {', '}', () {
-    indent.writeln('FlutterBasicMessageChannel *channel =');
-    indent.nest(1, () {
-      indent.writeln('[FlutterBasicMessageChannel');
-      indent.nest(1, () {
-        indent
-            .writeln('messageChannelWithName:@"${makeChannelName(api, func)}"');
-        indent.writeln('binaryMessenger:self.binaryMessenger');
-        indent.write(
-            'codec:${_getCodecGetterName(languageOptions.prefix, api.name)}()');
-        indent.addln('];');
-      });
-    });
-    indent.write('[channel sendMessage:$sendArgument reply:^(id reply) ');
-    indent.addScoped('{', '}];', () {
-      if (func.returnType.isVoid) {
-        indent.writeln('completion(nil);');
-      } else {
-        indent.writeln('${returnType.ptr}output = reply;');
-        indent.writeln('completion(output, nil);');
-      }
-    });
-  });
-}
-
 /// Looks through the AST for features that aren't supported by the ObjC
 /// generator.
 List<Error> validateObjc(ObjcOptions options, Root root) {
diff --git a/packages/pigeon/mock_handler_tester/test/message.dart b/packages/pigeon/mock_handler_tester/test/message.dart
index 2b9a33c..2de8cd5 100644
--- a/packages/pigeon/mock_handler_tester/test/message.dart
+++ b/packages/pigeon/mock_handler_tester/test/message.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/mock_handler_tester/test/test.dart b/packages/pigeon/mock_handler_tester/test/test.dart
index bee1f45..bdd87c3 100644
--- a/packages/pigeon/mock_handler_tester/test/test.dart
+++ b/packages/pigeon/mock_handler_tester/test/test.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java
index c43837c..f1194d8 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 package com.example.alternate_language_test_plugin;
@@ -196,7 +196,6 @@
     private AllTypes() {}
 
     public static final class Builder {
-
       private @Nullable Boolean aBool;
 
       public @NonNull Builder setABool(@NonNull Boolean setterArg) {
@@ -480,7 +479,6 @@
     }
 
     public static final class Builder {
-
       private @Nullable Boolean aNullableBool;
 
       public @NonNull Builder setANullableBool(@Nullable Boolean setterArg) {
@@ -677,7 +675,6 @@
     private AllNullableTypesWrapper() {}
 
     public static final class Builder {
-
       private @Nullable AllNullableTypes values;
 
       public @NonNull Builder setValues(@NonNull AllNullableTypes setterArg) {
@@ -3338,7 +3335,6 @@
    * <p>Generated interface from Pigeon that represents a handler of messages from Flutter.
    */
   public interface HostTrivialApi {
-
     void noop();
 
     /** The codec used by HostTrivialApi. */
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/Runner.xcodeproj/project.pbxproj b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/Runner.xcodeproj/project.pbxproj
index 0ed178f..ec7df03 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/Runner.xcodeproj/project.pbxproj
@@ -326,6 +326,7 @@
 			files = (
 			);
 			inputPaths = (
+				"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
 			);
 			name = "Thin Binary";
 			outputPaths = (
@@ -530,6 +531,7 @@
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CURRENT_PROJECT_VERSION = 1;
+				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
@@ -544,6 +546,7 @@
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CURRENT_PROJECT_VERSION = 1;
+				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
@@ -558,6 +561,7 @@
 			buildSettings = {
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CURRENT_PROJECT_VERSION = 1;
+				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests;
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AllDatatypesTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AllDatatypesTest.m
index 623a373..4ac3d8a 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AllDatatypesTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AllDatatypesTest.m
@@ -24,7 +24,7 @@
       [[FlutterIntegrationCoreApi alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   [api echoAllNullableTypes:everything
-                 completion:^(AllNullableTypes *_Nonnull result, NSError *_Nullable error) {
+                 completion:^(AllNullableTypes *_Nonnull result, FlutterError *_Nullable error) {
                    XCTAssertNil(result.aNullableBool);
                    XCTAssertNil(result.aNullableInt);
                    XCTAssertNil(result.aNullableDouble);
@@ -63,7 +63,7 @@
       [[FlutterIntegrationCoreApi alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   [api echoAllNullableTypes:everything
-                 completion:^(AllNullableTypes *_Nonnull result, NSError *_Nullable error) {
+                 completion:^(AllNullableTypes *_Nonnull result, FlutterError *_Nullable error) {
                    XCTAssertEqual(result.aNullableBool, everything.aNullableBool);
                    XCTAssertEqual(result.aNullableInt, everything.aNullableInt);
                    XCTAssertEqual(result.aNullableDouble, everything.aNullableDouble);
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AsyncHandlersTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AsyncHandlersTest.m
index d8a2033..e72da1d 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AsyncHandlersTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/AsyncHandlersTest.m
@@ -57,7 +57,7 @@
   input.number = @(1);
   XCTestExpectation *expectation = [self expectationWithDescription:@"calculate callback"];
   [api2Flutter calculateValue:input
-                   completion:^(Value *_Nonnull output, NSError *_Nullable error) {
+                   completion:^(Value *_Nonnull output, FlutterError *_Nullable error) {
                      XCTAssertEqual(output.number.intValue, 2);
                      [expectation fulfill];
                    }];
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EchoMessenger.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EchoMessenger.m
index cd86bfd..b7b3342 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EchoMessenger.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EchoMessenger.m
@@ -20,7 +20,7 @@
   return self;
 }
 
-- (void)cleanupConnection:(FlutterBinaryMessengerConnection)connection {
+- (void)cleanUpConnection:(FlutterBinaryMessengerConnection)connection {
 }
 
 - (void)sendOnChannel:(nonnull NSString *)channel message:(NSData *_Nullable)message {
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EnumTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EnumTest.m
index 54d3d27..99ff3eb 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EnumTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/EnumTest.m
@@ -24,7 +24,7 @@
   EnumApi2Flutter *api = [[EnumApi2Flutter alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   [api echoData:data
-      completion:^(DataWithEnum *_Nonnull result, NSError *_Nullable error) {
+      completion:^(DataWithEnum *_Nonnull result, FlutterError *_Nullable error) {
         XCTAssertEqual(data.state, result.state);
         [expectation fulfill];
       }];
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/HandlerBinaryMessenger.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/HandlerBinaryMessenger.m
index e593333..05c38f8 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/HandlerBinaryMessenger.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/HandlerBinaryMessenger.m
@@ -23,7 +23,7 @@
   return self;
 }
 
-- (void)cleanupConnection:(FlutterBinaryMessengerConnection)connection {
+- (void)cleanUpConnection:(FlutterBinaryMessengerConnection)connection {
 }
 
 - (void)sendOnChannel:(nonnull NSString *)channel message:(NSData *_Nullable)message {
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/ListTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/ListTest.m
index 70c2842..479a80f 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/ListTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/ListTest.m
@@ -26,7 +26,7 @@
   EchoApi *api = [[EchoApi alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   [api echoMsg:top
-      completion:^(TestMessage *_Nonnull result, NSError *_Nullable err) {
+      completion:^(TestMessage *_Nonnull result, FlutterError *_Nullable err) {
         XCTAssertEqual(1u, result.testList.count);
         XCTAssertTrue([result.testList[0] isKindOfClass:[TestMessage class]]);
         XCTAssertEqualObjects(inside.testList, [result.testList[0] testList]);
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/MultipleArityTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/MultipleArityTest.m
index fe6ce3f..3bef858 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/MultipleArityTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/MultipleArityTest.m
@@ -27,7 +27,7 @@
   XCTestExpectation *expectation = [self expectationWithDescription:@"subtraction"];
   [api subtractX:@(30)
                y:@(10)
-      completion:^(NSNumber *_Nonnull result, NSError *_Nullable error) {
+      completion:^(NSNumber *_Nonnull result, FlutterError *_Nullable error) {
         XCTAssertNil(error);
         XCTAssertEqual(20, result.intValue);
         [expectation fulfill];
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/NullableReturnsTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/NullableReturnsTest.m
index 71baf86..d09be4c 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/NullableReturnsTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/NullableReturnsTest.m
@@ -40,7 +40,7 @@
       [[NullableArgFlutterApi alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   [api doitX:nil
-      completion:^(NSNumber *_Nonnull result, NSError *_Nullable error) {
+      completion:^(NSNumber *_Nonnull result, FlutterError *_Nullable error) {
         XCTAssertNil(result);
         [expectation fulfill];
       }];
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/PrimitiveTest.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/PrimitiveTest.m
index 5b554a7..19a4835 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/PrimitiveTest.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/example/ios/RunnerTests/PrimitiveTest.m
@@ -22,7 +22,7 @@
   PrimitiveFlutterApi *api = [[PrimitiveFlutterApi alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   [api anIntValue:@1
-       completion:^(NSNumber *_Nonnull result, NSError *_Nullable err) {
+       completion:^(NSNumber *_Nonnull result, FlutterError *_Nullable err) {
          XCTAssertEqualObjects(@1, result);
          [expectation fulfill];
        }];
@@ -36,7 +36,7 @@
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   NSNumber *arg = @YES;
   [api aBoolValue:arg
-       completion:^(NSNumber *_Nonnull result, NSError *_Nullable err) {
+       completion:^(NSNumber *_Nonnull result, FlutterError *_Nullable err) {
          XCTAssertEqualObjects(arg, result);
          [expectation fulfill];
        }];
@@ -50,7 +50,7 @@
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   NSNumber *arg = @(1.5);
   [api aBoolValue:arg
-       completion:^(NSNumber *_Nonnull result, NSError *_Nullable err) {
+       completion:^(NSNumber *_Nonnull result, FlutterError *_Nullable err) {
          XCTAssertEqualObjects(arg, result);
          [expectation fulfill];
        }];
@@ -64,7 +64,7 @@
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   NSString *arg = @"hello";
   [api aStringValue:arg
-         completion:^(NSString *_Nonnull result, NSError *_Nullable err) {
+         completion:^(NSString *_Nonnull result, FlutterError *_Nullable err) {
            XCTAssertEqualObjects(arg, result);
            [expectation fulfill];
          }];
@@ -78,7 +78,7 @@
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   NSArray *arg = @[ @"hello" ];
   [api aListValue:arg
-       completion:^(NSArray *_Nonnull result, NSError *_Nullable err) {
+       completion:^(NSArray *_Nonnull result, FlutterError *_Nullable err) {
          XCTAssertEqualObjects(arg, result);
          [expectation fulfill];
        }];
@@ -92,7 +92,7 @@
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
   NSDictionary *arg = @{@"hello" : @1};
   [api aMapValue:arg
-      completion:^(NSDictionary *_Nonnull result, NSError *_Nullable err) {
+      completion:^(NSDictionary *_Nonnull result, FlutterError *_Nullable err) {
         XCTAssertEqualObjects(arg, result);
         [expectation fulfill];
       }];
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m
index ee89e6b..578ef71 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m
@@ -253,7 +253,7 @@
 }
 
 - (void)callFlutterNoopWithCompletion:(void (^)(FlutterError *_Nullable))completion {
-  [self.flutterAPI noopWithCompletion:^(NSError *error) {
+  [self.flutterAPI noopWithCompletion:^(FlutterError *error) {
     completion(error);
   }];
 }
@@ -261,7 +261,7 @@
 - (void)callFlutterEchoAllTypes:(AllTypes *)everything
                      completion:(void (^)(AllTypes *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoAllTypes:everything
-                     completion:^(AllTypes *value, NSError *error) {
+                     completion:^(AllTypes *value, FlutterError *error) {
                        completion(value, error);
                      }];
 }
@@ -274,7 +274,7 @@
   [self.flutterAPI sendMultipleNullableTypesABool:aNullableBool
                                             anInt:aNullableInt
                                           aString:aNullableString
-                                       completion:^(AllNullableTypes *value, NSError *error) {
+                                       completion:^(AllNullableTypes *value, FlutterError *error) {
                                          completion(value, error);
                                        }];
 }
@@ -282,7 +282,7 @@
 - (void)callFlutterEchoBool:(NSNumber *)aBool
                  completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoBool:aBool
-                 completion:^(NSNumber *value, NSError *error) {
+                 completion:^(NSNumber *value, FlutterError *error) {
                    completion(value, error);
                  }];
 }
@@ -290,7 +290,7 @@
 - (void)callFlutterEchoInt:(NSNumber *)anInt
                 completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoInt:anInt
-                completion:^(NSNumber *value, NSError *error) {
+                completion:^(NSNumber *value, FlutterError *error) {
                   completion(value, error);
                 }];
 }
@@ -298,7 +298,7 @@
 - (void)callFlutterEchoDouble:(NSNumber *)aDouble
                    completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoDouble:aDouble
-                   completion:^(NSNumber *value, NSError *error) {
+                   completion:^(NSNumber *value, FlutterError *error) {
                      completion(value, error);
                    }];
 }
@@ -306,7 +306,7 @@
 - (void)callFlutterEchoString:(NSString *)aString
                    completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoString:aString
-                   completion:^(NSString *value, NSError *error) {
+                   completion:^(NSString *value, FlutterError *error) {
                      completion(value, error);
                    }];
 }
@@ -315,7 +315,7 @@
                       completion:(void (^)(FlutterStandardTypedData *_Nullable,
                                            FlutterError *_Nullable))completion {
   [self.flutterAPI echoUint8List:aList
-                      completion:^(FlutterStandardTypedData *value, NSError *error) {
+                      completion:^(FlutterStandardTypedData *value, FlutterError *error) {
                         completion(value, error);
                       }];
 }
@@ -323,7 +323,7 @@
 - (void)callFlutterEchoList:(NSArray<id> *)aList
                  completion:(void (^)(NSArray<id> *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoList:aList
-                 completion:^(NSArray<id> *value, NSError *error) {
+                 completion:^(NSArray<id> *value, FlutterError *error) {
                    completion(value, error);
                  }];
 }
@@ -332,7 +332,7 @@
                 completion:(void (^)(NSDictionary<NSString *, id> *_Nullable,
                                      FlutterError *_Nullable))completion {
   [self.flutterAPI echoMap:aMap
-                completion:^(NSDictionary<NSString *, id> *value, NSError *error) {
+                completion:^(NSDictionary<NSString *, id> *value, FlutterError *error) {
                   completion(value, error);
                 }];
 }
@@ -341,7 +341,7 @@
                          completion:
                              (void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableBool:aBool
-                         completion:^(NSNumber *value, NSError *error) {
+                         completion:^(NSNumber *value, FlutterError *error) {
                            completion(value, error);
                          }];
 }
@@ -350,7 +350,7 @@
                         completion:
                             (void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableInt:anInt
-                        completion:^(NSNumber *value, NSError *error) {
+                        completion:^(NSNumber *value, FlutterError *error) {
                           completion(value, error);
                         }];
 }
@@ -359,7 +359,7 @@
                            completion:
                                (void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableDouble:aDouble
-                           completion:^(NSNumber *value, NSError *error) {
+                           completion:^(NSNumber *value, FlutterError *error) {
                              completion(value, error);
                            }];
 }
@@ -368,7 +368,7 @@
                            completion:
                                (void (^)(NSString *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableString:aString
-                           completion:^(NSString *value, NSError *error) {
+                           completion:^(NSString *value, FlutterError *error) {
                              completion(value, error);
                            }];
 }
@@ -377,7 +377,7 @@
                               completion:(void (^)(FlutterStandardTypedData *_Nullable,
                                                    FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableUint8List:aList
-                              completion:^(FlutterStandardTypedData *value, NSError *error) {
+                              completion:^(FlutterStandardTypedData *value, FlutterError *error) {
                                 completion(value, error);
                               }];
 }
@@ -386,7 +386,7 @@
                          completion:
                              (void (^)(NSArray<id> *_Nullable, FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableList:aList
-                         completion:^(NSArray<id> *value, NSError *error) {
+                         completion:^(NSArray<id> *value, FlutterError *error) {
                            completion(value, error);
                          }];
 }
@@ -395,7 +395,7 @@
                         completion:(void (^)(NSDictionary<NSString *, id> *_Nullable,
                                              FlutterError *_Nullable))completion {
   [self.flutterAPI echoNullableMap:aMap
-                        completion:^(NSDictionary<NSString *, id> *value, NSError *error) {
+                        completion:^(NSDictionary<NSString *, id> *value, FlutterError *error) {
                           completion(value, error);
                         }];
 }
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h
index 8a0c007..062382f 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import <Foundation/Foundation.h>
@@ -317,13 +317,14 @@
 - (instancetype)initWithBinaryMessenger:(id<FlutterBinaryMessenger>)binaryMessenger;
 /// A no-op function taking no arguments and returning no value, to sanity
 /// test basic calling.
-- (void)noopWithCompletion:(void (^)(NSError *_Nullable))completion;
+- (void)noopWithCompletion:(void (^)(FlutterError *_Nullable))completion;
 /// Returns the passed object, to test serialization and deserialization.
 - (void)echoAllTypes:(AllTypes *)everything
-          completion:(void (^)(AllTypes *_Nullable, NSError *_Nullable))completion;
+          completion:(void (^)(AllTypes *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed object, to test serialization and deserialization.
 - (void)echoAllNullableTypes:(AllNullableTypes *)everything
-                  completion:(void (^)(AllNullableTypes *_Nullable, NSError *_Nullable))completion;
+                  completion:
+                      (void (^)(AllNullableTypes *_Nullable, FlutterError *_Nullable))completion;
 /// Returns passed in arguments of multiple types.
 ///
 /// Tests multiple-arity FlutterApi handling.
@@ -331,51 +332,53 @@
                                  anInt:(nullable NSNumber *)aNullableInt
                                aString:(nullable NSString *)aNullableString
                             completion:(void (^)(AllNullableTypes *_Nullable,
-                                                 NSError *_Nullable))completion;
+                                                 FlutterError *_Nullable))completion;
 /// Returns the passed boolean, to test serialization and deserialization.
 - (void)echoBool:(NSNumber *)aBool
-      completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;
+      completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed int, to test serialization and deserialization.
 - (void)echoInt:(NSNumber *)anInt
-     completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;
+     completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed double, to test serialization and deserialization.
 - (void)echoDouble:(NSNumber *)aDouble
-        completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;
+        completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed string, to test serialization and deserialization.
 - (void)echoString:(NSString *)aString
-        completion:(void (^)(NSString *_Nullable, NSError *_Nullable))completion;
+        completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed byte list, to test serialization and deserialization.
 - (void)echoUint8List:(FlutterStandardTypedData *)aList
-           completion:(void (^)(FlutterStandardTypedData *_Nullable, NSError *_Nullable))completion;
+           completion:
+               (void (^)(FlutterStandardTypedData *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed list, to test serialization and deserialization.
 - (void)echoList:(NSArray<id> *)aList
-      completion:(void (^)(NSArray<id> *_Nullable, NSError *_Nullable))completion;
+      completion:(void (^)(NSArray<id> *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed map, to test serialization and deserialization.
 - (void)echoMap:(NSDictionary<NSString *, id> *)aMap
-     completion:(void (^)(NSDictionary<NSString *, id> *_Nullable, NSError *_Nullable))completion;
+     completion:
+         (void (^)(NSDictionary<NSString *, id> *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed boolean, to test serialization and deserialization.
 - (void)echoNullableBool:(nullable NSNumber *)aBool
-              completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;
+              completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed int, to test serialization and deserialization.
 - (void)echoNullableInt:(nullable NSNumber *)anInt
-             completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;
+             completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed double, to test serialization and deserialization.
 - (void)echoNullableDouble:(nullable NSNumber *)aDouble
-                completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;
+                completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed string, to test serialization and deserialization.
 - (void)echoNullableString:(nullable NSString *)aString
-                completion:(void (^)(NSString *_Nullable, NSError *_Nullable))completion;
+                completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed byte list, to test serialization and deserialization.
 - (void)echoNullableUint8List:(nullable FlutterStandardTypedData *)aList
                    completion:(void (^)(FlutterStandardTypedData *_Nullable,
-                                        NSError *_Nullable))completion;
+                                        FlutterError *_Nullable))completion;
 /// Returns the passed list, to test serialization and deserialization.
 - (void)echoNullableList:(nullable NSArray<id> *)aList
-              completion:(void (^)(NSArray<id> *_Nullable, NSError *_Nullable))completion;
+              completion:(void (^)(NSArray<id> *_Nullable, FlutterError *_Nullable))completion;
 /// Returns the passed map, to test serialization and deserialization.
 - (void)echoNullableMap:(nullable NSDictionary<NSString *, id> *)aMap
-             completion:
-                 (void (^)(NSDictionary<NSString *, id> *_Nullable, NSError *_Nullable))completion;
+             completion:(void (^)(NSDictionary<NSString *, id> *_Nullable,
+                                  FlutterError *_Nullable))completion;
 @end
 
 /// The codec used by HostTrivialApi.
diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m
index 7069c17..6970ca8 100644
--- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m
+++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #import "CoreTests.gen.h"
@@ -1716,7 +1716,7 @@
   }
   return self;
 }
-- (void)noopWithCompletion:(void (^)(NSError *_Nullable))completion {
+- (void)noopWithCompletion:(void (^)(FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.noop"
              binaryMessenger:self.binaryMessenger
@@ -1727,7 +1727,7 @@
                  }];
 }
 - (void)echoAllTypes:(AllTypes *)arg_everything
-          completion:(void (^)(AllTypes *_Nullable, NSError *_Nullable))completion {
+          completion:(void (^)(AllTypes *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoAllTypes"
              binaryMessenger:self.binaryMessenger
@@ -1739,7 +1739,8 @@
                  }];
 }
 - (void)echoAllNullableTypes:(AllNullableTypes *)arg_everything
-                  completion:(void (^)(AllNullableTypes *_Nullable, NSError *_Nullable))completion {
+                  completion:
+                      (void (^)(AllNullableTypes *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoAllNullableTypes"
              binaryMessenger:self.binaryMessenger
@@ -1754,7 +1755,7 @@
                                  anInt:(nullable NSNumber *)arg_aNullableInt
                                aString:(nullable NSString *)arg_aNullableString
                             completion:(void (^)(AllNullableTypes *_Nullable,
-                                                 NSError *_Nullable))completion {
+                                                 FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:
           @"dev.flutter.pigeon.FlutterIntegrationCoreApi.sendMultipleNullableTypes"
@@ -1770,7 +1771,7 @@
                  }];
 }
 - (void)echoBool:(NSNumber *)arg_aBool
-      completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {
+      completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoBool"
              binaryMessenger:self.binaryMessenger
@@ -1782,7 +1783,7 @@
                  }];
 }
 - (void)echoInt:(NSNumber *)arg_anInt
-     completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {
+     completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoInt"
              binaryMessenger:self.binaryMessenger
@@ -1794,7 +1795,7 @@
                  }];
 }
 - (void)echoDouble:(NSNumber *)arg_aDouble
-        completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {
+        completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoDouble"
              binaryMessenger:self.binaryMessenger
@@ -1806,7 +1807,7 @@
                  }];
 }
 - (void)echoString:(NSString *)arg_aString
-        completion:(void (^)(NSString *_Nullable, NSError *_Nullable))completion {
+        completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoString"
              binaryMessenger:self.binaryMessenger
@@ -1819,7 +1820,7 @@
 }
 - (void)echoUint8List:(FlutterStandardTypedData *)arg_aList
            completion:
-               (void (^)(FlutterStandardTypedData *_Nullable, NSError *_Nullable))completion {
+               (void (^)(FlutterStandardTypedData *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoUint8List"
              binaryMessenger:self.binaryMessenger
@@ -1831,7 +1832,7 @@
                  }];
 }
 - (void)echoList:(NSArray<id> *)arg_aList
-      completion:(void (^)(NSArray<id> *_Nullable, NSError *_Nullable))completion {
+      completion:(void (^)(NSArray<id> *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoList"
              binaryMessenger:self.binaryMessenger
@@ -1843,7 +1844,8 @@
                  }];
 }
 - (void)echoMap:(NSDictionary<NSString *, id> *)arg_aMap
-     completion:(void (^)(NSDictionary<NSString *, id> *_Nullable, NSError *_Nullable))completion {
+     completion:
+         (void (^)(NSDictionary<NSString *, id> *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoMap"
              binaryMessenger:self.binaryMessenger
@@ -1855,7 +1857,7 @@
                  }];
 }
 - (void)echoNullableBool:(nullable NSNumber *)arg_aBool
-              completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {
+              completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableBool"
              binaryMessenger:self.binaryMessenger
@@ -1867,7 +1869,7 @@
                  }];
 }
 - (void)echoNullableInt:(nullable NSNumber *)arg_anInt
-             completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {
+             completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableInt"
              binaryMessenger:self.binaryMessenger
@@ -1879,7 +1881,7 @@
                  }];
 }
 - (void)echoNullableDouble:(nullable NSNumber *)arg_aDouble
-                completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {
+                completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableDouble"
              binaryMessenger:self.binaryMessenger
@@ -1891,7 +1893,7 @@
                  }];
 }
 - (void)echoNullableString:(nullable NSString *)arg_aString
-                completion:(void (^)(NSString *_Nullable, NSError *_Nullable))completion {
+                completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableString"
              binaryMessenger:self.binaryMessenger
@@ -1904,7 +1906,7 @@
 }
 - (void)echoNullableUint8List:(nullable FlutterStandardTypedData *)arg_aList
                    completion:(void (^)(FlutterStandardTypedData *_Nullable,
-                                        NSError *_Nullable))completion {
+                                        FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableUint8List"
              binaryMessenger:self.binaryMessenger
@@ -1916,7 +1918,7 @@
                  }];
 }
 - (void)echoNullableList:(nullable NSArray<id> *)arg_aList
-              completion:(void (^)(NSArray<id> *_Nullable, NSError *_Nullable))completion {
+              completion:(void (^)(NSArray<id> *_Nullable, FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableList"
              binaryMessenger:self.binaryMessenger
@@ -1928,8 +1930,8 @@
                  }];
 }
 - (void)echoNullableMap:(nullable NSDictionary<NSString *, id> *)arg_aMap
-             completion:
-                 (void (^)(NSDictionary<NSString *, id> *_Nullable, NSError *_Nullable))completion {
+             completion:(void (^)(NSDictionary<NSString *, id> *_Nullable,
+                                  FlutterError *_Nullable))completion {
   FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel
       messageChannelWithName:@"dev.flutter.pigeon.FlutterIntegrationCoreApi.echoNullableMap"
              binaryMessenger:self.binaryMessenger
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart
index e2926fe..bf0b3a5 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/flutter_unittests.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/flutter_unittests.gen.dart
index a2cce70..e869f1a 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/flutter_unittests.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/flutter_unittests.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
index 251d69f..4378d4f 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
index bc46451..04695f5 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
index 65b9384..e53e111 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
index 4d4a325..9b4749b 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.gen.dart
index d481026..949f79d 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart
index e2926fe..bf0b3a5 100644
--- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart
+++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), 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/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt
index 8a1e42b..c946b5c 100644
--- a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt
+++ b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt
@@ -1,8 +1,8 @@
 // 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 (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 package com.example.test_plugin
diff --git a/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift
index 14ec95b..db401db 100644
--- a/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift
+++ b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift
@@ -1,8 +1,8 @@
 // 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 (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -117,23 +117,23 @@
   var aNullableString: String? = nil
 
   static func fromList(_ list: [Any?]) -> AllNullableTypes? {
-    let aNullableBool = list[0] as? Bool 
-    let aNullableInt = list[1] as? Int32 
-    let aNullableDouble = list[2] as? Double 
-    let aNullableByteArray = list[3] as? FlutterStandardTypedData 
-    let aNullable4ByteArray = list[4] as? FlutterStandardTypedData 
-    let aNullable8ByteArray = list[5] as? FlutterStandardTypedData 
-    let aNullableFloatArray = list[6] as? FlutterStandardTypedData 
-    let aNullableList = list[7] as? [Any?] 
-    let aNullableMap = list[8] as? [AnyHashable: Any?] 
-    let nullableNestedList = list[9] as? [[Bool?]?] 
-    let nullableMapWithAnnotations = list[10] as? [String?: String?] 
-    let nullableMapWithObject = list[11] as? [String?: Any?] 
+    let aNullableBool = list[0] as? Bool
+    let aNullableInt = list[1] as? Int32
+    let aNullableDouble = list[2] as? Double
+    let aNullableByteArray = list[3] as? FlutterStandardTypedData
+    let aNullable4ByteArray = list[4] as? FlutterStandardTypedData
+    let aNullable8ByteArray = list[5] as? FlutterStandardTypedData
+    let aNullableFloatArray = list[6] as? FlutterStandardTypedData
+    let aNullableList = list[7] as? [Any?]
+    let aNullableMap = list[8] as? [AnyHashable: Any?]
+    let nullableNestedList = list[9] as? [[Bool?]?]
+    let nullableMapWithAnnotations = list[10] as? [String?: String?]
+    let nullableMapWithObject = list[11] as? [String?: Any?]
     var aNullableEnum: AnEnum? = nil
     if let aNullableEnumRawValue = list[12] as? Int {
       aNullableEnum = AnEnum(rawValue: aNullableEnumRawValue)
     }
-    let aNullableString = list[13] as? String 
+    let aNullableString = list[13] as? String
 
     return AllNullableTypes(
       aNullableBool: aNullableBool,
diff --git a/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift
index 14ec95b..db401db 100644
--- a/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift
+++ b/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift
@@ -1,8 +1,8 @@
 // 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 (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -117,23 +117,23 @@
   var aNullableString: String? = nil
 
   static func fromList(_ list: [Any?]) -> AllNullableTypes? {
-    let aNullableBool = list[0] as? Bool 
-    let aNullableInt = list[1] as? Int32 
-    let aNullableDouble = list[2] as? Double 
-    let aNullableByteArray = list[3] as? FlutterStandardTypedData 
-    let aNullable4ByteArray = list[4] as? FlutterStandardTypedData 
-    let aNullable8ByteArray = list[5] as? FlutterStandardTypedData 
-    let aNullableFloatArray = list[6] as? FlutterStandardTypedData 
-    let aNullableList = list[7] as? [Any?] 
-    let aNullableMap = list[8] as? [AnyHashable: Any?] 
-    let nullableNestedList = list[9] as? [[Bool?]?] 
-    let nullableMapWithAnnotations = list[10] as? [String?: String?] 
-    let nullableMapWithObject = list[11] as? [String?: Any?] 
+    let aNullableBool = list[0] as? Bool
+    let aNullableInt = list[1] as? Int32
+    let aNullableDouble = list[2] as? Double
+    let aNullableByteArray = list[3] as? FlutterStandardTypedData
+    let aNullable4ByteArray = list[4] as? FlutterStandardTypedData
+    let aNullable8ByteArray = list[5] as? FlutterStandardTypedData
+    let aNullableFloatArray = list[6] as? FlutterStandardTypedData
+    let aNullableList = list[7] as? [Any?]
+    let aNullableMap = list[8] as? [AnyHashable: Any?]
+    let nullableNestedList = list[9] as? [[Bool?]?]
+    let nullableMapWithAnnotations = list[10] as? [String?: String?]
+    let nullableMapWithObject = list[11] as? [String?: Any?]
     var aNullableEnum: AnEnum? = nil
     if let aNullableEnumRawValue = list[12] as? Int {
       aNullableEnum = AnEnum(rawValue: aNullableEnumRawValue)
     }
-    let aNullableString = list[13] as? String 
+    let aNullableString = list[13] as? String
 
     return AllNullableTypes(
       aNullableBool: aNullableBool,
diff --git a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp
index c2bdca9..c256d57 100644
--- a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp
+++ b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #undef _HAS_EXCEPTIONS
diff --git a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h
index 90c0afd..024c882 100644
--- a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h
+++ b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v7.2.1), do not edit directly.
+// Autogenerated from Pigeon (v8.0.0), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 #ifndef PIGEON_CORE_TESTS_GEN_H_
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index 0b62f13..29140d9 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
 repository: https://github.com/flutter/packages/tree/main/packages/pigeon
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
-version: 7.2.1 # This must match the version in lib/generator_tools.dart
+version: 8.0.0 # This must match the version in lib/generator_tools.dart
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart
index e54bf59..a4e5f04 100644
--- a/packages/pigeon/test/objc_generator_test.dart
+++ b/packages/pigeon/test/objc_generator_test.dart
@@ -801,7 +801,7 @@
     );
     generator.generate(generatorOptions, root, sink);
     final String code = sink.toString();
-    expect(code, contains('completion:(void (^)(NSError *_Nullable))'));
+    expect(code, contains('completion:(void (^)(FlutterError *_Nullable))'));
   });
 
   test('gen flutter void return source', () {
@@ -836,7 +836,7 @@
     );
     generator.generate(generatorOptions, root, sink);
     final String code = sink.toString();
-    expect(code, contains('completion:(void (^)(NSError *_Nullable))'));
+    expect(code, contains('completion:(void (^)(FlutterError *_Nullable))'));
     expect(code, contains('completion(nil)'));
   });
 
@@ -927,7 +927,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
+            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
   });
 
   test('gen flutter void arg source', () {
@@ -959,7 +959,7 @@
     expect(
         code,
         contains(
-            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
+            '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
     expect(code, contains('channel sendMessage:nil'));
   });
 
@@ -1818,7 +1818,7 @@
       expect(
           code,
           contains(
-              '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;'));
+              '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;'));
     }
     {
       final StringBuffer sink = StringBuffer();
@@ -1834,7 +1834,7 @@
       expect(
           code,
           contains(
-              '- (void)addX:(NSNumber *)arg_x y:(NSNumber *)arg_y completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {'));
+              '- (void)addX:(NSNumber *)arg_x y:(NSNumber *)arg_y completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion {'));
       expect(
           code,
           contains(
@@ -1977,7 +1977,7 @@
     expect(
         code,
         matches(
-            r'doitWithCompletion.*void.*NSNumber \*_Nullable.*NSError.*completion;'));
+            r'doitWithCompletion.*void.*NSNumber \*_Nullable.*FlutterError.*completion;'));
   });
 
   test('return nullable flutter source', () {