[pigeon] fixed cast error that can happen with FlutterApi and primitive lists (#506)

diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index 33ed27c..014e640 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.0.9
+
+* [dart] Fixed cast exception that can happen with primitive data types with
+  type arguments in FlutterApi's.
+
 ## 1.0.8
 
 * [front-end] Started accepting explicit Object references in type arguments.
diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart
index 79711e2..625b1d0 100644
--- a/packages/pigeon/lib/dart_generator.dart
+++ b/packages/pigeon/lib/dart_generator.dart
@@ -236,20 +236,21 @@
       );
       indent.writeln('$returnType ${func.name}($argSignature);');
     }
-    indent.write('static void setup(${api.name}$nullTag api) ');
+    indent.write(
+        'static void setup(${api.name}$nullTag api, {BinaryMessenger$nullTag binaryMessenger}) ');
     indent.scoped('{', '}', () {
       for (final Method func in api.methods) {
         indent.write('');
         indent.scoped('{', '}', () {
           indent.writeln(
-            'const BasicMessageChannel<Object$nullTag> channel = BasicMessageChannel<Object$nullTag>(',
+            'final BasicMessageChannel<Object$nullTag> channel = BasicMessageChannel<Object$nullTag>(',
           );
           final String channelName = channelNameFunc == null
               ? makeChannelName(api, func)
               : channelNameFunc(func);
           indent.nest(2, () {
             indent.writeln(
-              '\'$channelName\', codec);',
+              '\'$channelName\', codec, binaryMessenger: binaryMessenger);',
             );
           });
           final String messageHandlerSetter =
@@ -288,8 +289,13 @@
                 enumerate(func.arguments, (int count, NamedType arg) {
                   final String argType = _addGenericTypes(arg.type, nullTag);
                   final String argName = argNameFunc(count, arg);
+                  final String genericArgType =
+                      _makeGenericTypeArguments(arg.type, nullTag);
+                  final String castCall =
+                      _makeGenericCastCall(arg.type, nullTag);
+
                   indent.writeln(
-                      'final $argType$nullTag $argName = $argsArray[$count] as $argType$nullTag;');
+                      'final $argType$nullTag $argName = ($argsArray[$count] as $genericArgType$nullTag)${castCall.isEmpty ? '' : '$nullTag$castCall'};');
                   indent.writeln(
                       'assert($argName != null, \'Argument for $channelName was null, expected non-null $argType.\');');
                 });
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 8164d24..4bedecb 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -8,7 +8,7 @@
 import 'ast.dart';
 
 /// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '1.0.8';
+const String pigeonVersion = '1.0.9';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/all_datatypes.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/all_datatypes.dart
index 06ba8f5..f1b63b0 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/all_datatypes.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/all_datatypes.dart
@@ -183,10 +183,12 @@
 
   Everything giveMeEverything();
   Everything echo(Everything everything);
-  static void setup(FlutterEverything? api) {
+  static void setup(FlutterEverything? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.FlutterEverything.giveMeEverything', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.FlutterEverything.giveMeEverything', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -198,8 +200,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.FlutterEverything.echo', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.FlutterEverything.echo', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -207,7 +210,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.FlutterEverything.echo was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final Everything? arg_everything = args[0] as Everything?;
+          final Everything? arg_everything = (args[0] as Everything?);
           assert(arg_everything != null,
               'Argument for dev.flutter.pigeon.FlutterEverything.echo was null, expected non-null Everything.');
           final Everything output = api.echo(arg_everything!);
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 f7faca6..1a8f6b6 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 (v0.3.0), do not edit directly.
+// Autogenerated from Pigeon (v1.0.8), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name
 // @dart = 2.12
@@ -61,10 +61,12 @@
   static const MessageCodec<Object?> codec = _MultipleArityFlutterApiCodec();
 
   int subtract(int x, int y);
-  static void setup(MultipleArityFlutterApi? api) {
+  static void setup(MultipleArityFlutterApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.MultipleArityFlutterApi.subtract', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.MultipleArityFlutterApi.subtract', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -72,10 +74,10 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.MultipleArityFlutterApi.subtract was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_x = args[0] as int?;
+          final int? arg_x = (args[0] as int?);
           assert(arg_x != null,
               'Argument for dev.flutter.pigeon.MultipleArityFlutterApi.subtract was null, expected non-null int.');
-          final int? arg_y = args[1] as int?;
+          final int? arg_y = (args[1] as int?);
           assert(arg_y != null,
               'Argument for dev.flutter.pigeon.MultipleArityFlutterApi.subtract was null, expected non-null int.');
           final int output = api.subtract(arg_x!, arg_y!);
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
index 38166b4..b7e3f89 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Autogenerated from Pigeon (v0.3.0), do not edit directly.
+// Autogenerated from Pigeon (v1.0.8), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name
 // @dart = 2.12
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart
index 149ef84..5259a06 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.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 (v0.3.0), do not edit directly.
+// Autogenerated from Pigeon (v1.0.8), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name
 // @dart = 2.12
@@ -270,10 +270,12 @@
   Int32List anInt32List(Int32List value);
   List<bool?> aBoolList(List<bool?> value);
   Map<String?, int?> aStringIntMap(Map<String?, int?> value);
-  static void setup(PrimitiveFlutterApi? api) {
+  static void setup(PrimitiveFlutterApi? api,
+      {BinaryMessenger? binaryMessenger}) {
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.anInt', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.anInt', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -281,7 +283,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.anInt was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final int? arg_value = args[0] as int?;
+          final int? arg_value = (args[0] as int?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.anInt was null, expected non-null int.');
           final int output = api.anInt(arg_value!);
@@ -290,8 +292,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aBool', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aBool', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -299,7 +302,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aBool was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final bool? arg_value = args[0] as bool?;
+          final bool? arg_value = (args[0] as bool?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aBool was null, expected non-null bool.');
           final bool output = api.aBool(arg_value!);
@@ -308,8 +311,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aString', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aString', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -317,7 +321,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aString was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final String? arg_value = args[0] as String?;
+          final String? arg_value = (args[0] as String?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aString was null, expected non-null String.');
           final String output = api.aString(arg_value!);
@@ -326,8 +330,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aDouble', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aDouble', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -335,7 +340,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aDouble was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final double? arg_value = args[0] as double?;
+          final double? arg_value = (args[0] as double?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aDouble was null, expected non-null double.');
           final double output = api.aDouble(arg_value!);
@@ -344,8 +349,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aMap', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aMap', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -354,7 +360,7 @@
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aMap was null.');
           final List<Object?> args = (message as List<Object?>?)!;
           final Map<Object?, Object?>? arg_value =
-              args[0] as Map<Object?, Object?>?;
+              (args[0] as Map<Object?, Object?>?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aMap was null, expected non-null Map<Object?, Object?>.');
           final Map<Object?, Object?> output = api.aMap(arg_value!);
@@ -363,8 +369,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aList', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aList', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -372,7 +379,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aList was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final List<Object?>? arg_value = args[0] as List<Object?>?;
+          final List<Object?>? arg_value = (args[0] as List<Object?>?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aList was null, expected non-null List<Object?>.');
           final List<Object?> output = api.aList(arg_value!);
@@ -381,8 +388,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.anInt32List', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.anInt32List', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -390,7 +398,7 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.anInt32List was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final Int32List? arg_value = args[0] as Int32List?;
+          final Int32List? arg_value = (args[0] as Int32List?);
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.anInt32List was null, expected non-null Int32List.');
           final Int32List output = api.anInt32List(arg_value!);
@@ -399,8 +407,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aBoolList', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aBoolList', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -408,7 +417,8 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aBoolList was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final List<bool?>? arg_value = args[0] as List<bool?>?;
+          final List<bool?>? arg_value =
+              (args[0] as List<Object?>?)?.cast<bool?>();
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aBoolList was null, expected non-null List<bool?>.');
           final List<bool?> output = api.aBoolList(arg_value!);
@@ -417,8 +427,9 @@
       }
     }
     {
-      const BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.PrimitiveFlutterApi.aStringIntMap', codec);
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PrimitiveFlutterApi.aStringIntMap', codec,
+          binaryMessenger: binaryMessenger);
       if (api == null) {
         channel.setMessageHandler(null);
       } else {
@@ -426,7 +437,8 @@
           assert(message != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aStringIntMap was null.');
           final List<Object?> args = (message as List<Object?>?)!;
-          final Map<String?, int?>? arg_value = args[0] as Map<String?, int?>?;
+          final Map<String?, int?>? arg_value =
+              (args[0] as Map<Object?, Object?>?)?.cast<String?, int?>();
           assert(arg_value != null,
               'Argument for dev.flutter.pigeon.PrimitiveFlutterApi.aStringIntMap was null, expected non-null Map<String?, int?>.');
           final Map<String?, int?> output = api.aStringIntMap(arg_value!);
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.dart
index d3ca647..d83383f 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.dart
@@ -6,10 +6,12 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:flutter_unit_tests/primitive.dart';
 import 'package:mockito/annotations.dart';
+import 'package:mockito/mockito.dart';
+
 import 'primitive_test.mocks.dart';
 import 'test_util.dart';
 
-@GenerateMocks(<Type>[BinaryMessenger])
+@GenerateMocks(<Type>[BinaryMessenger, PrimitiveFlutterApi])
 void main() {
   test('test anInt', () async {
     final BinaryMessenger mockMessenger = MockBinaryMessenger();
@@ -37,6 +39,23 @@
     expect(result[0], true);
   });
 
+  test('test List<bool> flutterapi', () async {
+    final BinaryMessenger mockMessenger = MockBinaryMessenger();
+    final PrimitiveFlutterApi api = MockPrimitiveFlutterApi();
+    when(api.aBoolList(<bool?>[true, false])).thenReturn(<bool?>[]);
+    when(mockMessenger.setMessageHandler(
+            'dev.flutter.pigeon.PrimitiveFlutterApi.aBoolList', any))
+        .thenAnswer((Invocation realInvocation) {
+      final MessageHandler? handler =
+          realInvocation.positionalArguments[1] as MessageHandler?;
+      handler!(PrimitiveFlutterApi.codec.encodeMessage(<Object?>[
+        <Object?>[true, false]
+      ]));
+    });
+    PrimitiveFlutterApi.setup(api, binaryMessenger: mockMessenger);
+    verify(api.aBoolList(<bool?>[true, false]));
+  });
+
   test('test Map<String?, int?>', () async {
     final BinaryMessenger mockMessenger = MockBinaryMessenger();
     echoOneArgument(
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.mocks.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.mocks.dart
index 814ea41..b5769f9 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.mocks.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/test/primitive_test.mocks.dart
@@ -1,44 +1,95 @@
 // Mocks generated by Mockito 5.0.7 from annotations
-// in flutter_unit_tests/test/null_safe_test.dart.
+// in flutter_unit_tests/test/primitive_test.dart.
 // Do not manually edit this file.
 
-import 'dart:async' as _i3;
-import 'dart:typed_data' as _i4;
+import 'dart:async' as _i4;
+import 'dart:typed_data' as _i2;
 import 'dart:ui' as _i5;
 
-import 'package:flutter/src/services/binary_messenger.dart' as _i2;
+import 'package:flutter/src/services/binary_messenger.dart' as _i3;
+import 'package:flutter_unit_tests/primitive.dart' as _i6;
 import 'package:mockito/mockito.dart' as _i1;
 
 // ignore_for_file: comment_references
 // ignore_for_file: unnecessary_parenthesis
+
+// ignore_for_file: prefer_const_constructors
+
+// ignore_for_file: avoid_redundant_argument_values
 // ignore_for_file: always_specify_types
-// Added manually; several methods have moved to
-// flutter_test/lib/src/deprecated.dart on master, but that hasn't reached
-// stable yet.
-// ignore_for_file: override_on_non_overriding_member
+// ignore_for_file: implicit_dynamic_type
+// ignore_for_file: subtype_of_disallowed_type
+
+class _FakeInt32List extends _i1.Fake implements _i2.Int32List {}
 
 /// A class which mocks [BinaryMessenger].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockBinaryMessenger extends _i1.Mock implements _i2.BinaryMessenger {
+class MockBinaryMessenger extends _i1.Mock implements _i3.BinaryMessenger {
   MockBinaryMessenger() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i3.Future<void> handlePlatformMessage(String? channel, _i4.ByteData? data,
+  _i4.Future<void> handlePlatformMessage(String? channel, _i2.ByteData? data,
           _i5.PlatformMessageResponseCallback? callback) =>
       (super.noSuchMethod(
           Invocation.method(#handlePlatformMessage, [channel, data, callback]),
           returnValue: Future<void>.value(null),
-          returnValueForMissingStub:
-              Future<dynamic>.value()) as _i3.Future<void>);
+          returnValueForMissingStub: Future.value()) as _i4.Future<void>);
   @override
-  _i3.Future<_i4.ByteData?>? send(String? channel, _i4.ByteData? message) =>
+  _i4.Future<_i2.ByteData?>? send(String? channel, _i2.ByteData? message) =>
       (super.noSuchMethod(Invocation.method(#send, [channel, message]))
-          as _i3.Future<_i4.ByteData?>?);
+          as _i4.Future<_i2.ByteData?>?);
   @override
-  void setMessageHandler(String? channel, _i2.MessageHandler? handler) => super
+  void setMessageHandler(String? channel, _i3.MessageHandler? handler) => super
       .noSuchMethod(Invocation.method(#setMessageHandler, [channel, handler]),
           returnValueForMissingStub: null);
 }
+
+/// A class which mocks [PrimitiveFlutterApi].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockPrimitiveFlutterApi extends _i1.Mock
+    implements _i6.PrimitiveFlutterApi {
+  MockPrimitiveFlutterApi() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  int anInt(int? value) =>
+      (super.noSuchMethod(Invocation.method(#anInt, [value]), returnValue: 0)
+          as int);
+  @override
+  bool aBool(bool? value) => (super
+          .noSuchMethod(Invocation.method(#aBool, [value]), returnValue: false)
+      as bool);
+  @override
+  String aString(String? value) =>
+      (super.noSuchMethod(Invocation.method(#aString, [value]), returnValue: '')
+          as String);
+  @override
+  double aDouble(double? value) => (super
+          .noSuchMethod(Invocation.method(#aDouble, [value]), returnValue: 0.0)
+      as double);
+  @override
+  Map<Object?, Object?> aMap(Map<Object?, Object?>? value) =>
+      (super.noSuchMethod(Invocation.method(#aMap, [value]),
+          returnValue: <Object?, Object?>{}) as Map<Object?, Object?>);
+  @override
+  List<Object?> aList(List<Object?>? value) =>
+      (super.noSuchMethod(Invocation.method(#aList, [value]),
+          returnValue: <Object?>[]) as List<Object?>);
+  @override
+  _i2.Int32List anInt32List(_i2.Int32List? value) =>
+      (super.noSuchMethod(Invocation.method(#anInt32List, [value]),
+          returnValue: _FakeInt32List()) as _i2.Int32List);
+  @override
+  List<bool?> aBoolList(List<bool?>? value) =>
+      (super.noSuchMethod(Invocation.method(#aBoolList, [value]),
+          returnValue: <bool?>[]) as List<bool?>);
+  @override
+  Map<String?, int?> aStringIntMap(Map<String?, int?>? value) =>
+      (super.noSuchMethod(Invocation.method(#aStringIntMap, [value]),
+          returnValue: <String?, int?>{}) as Map<String?, int?>);
+}
diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj
index 1959250..6029534 100644
--- a/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/Runner.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 46;
+	objectVersion = 50;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -281,7 +281,7 @@
 		97C146E61CF9000F007C117D /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1020;
+				LastUpgradeCheck = 1300;
 				ORGANIZATIONNAME = "The Flutter Authors";
 				TargetAttributes = {
 					0D50127123FF75B100CD5B95 = {
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index 9d711f2..0dbdd8b 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/master/packages/pigeon
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
-version: 1.0.8 # This must match the version in lib/generator_tools.dart
+version: 1.0.9 # This must match the version in lib/generator_tools.dart
 
 environment:
   sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/pigeon/test/dart_generator_test.dart b/packages/pigeon/test/dart_generator_test.dart
index 92b73f8..0733fad 100644
--- a/packages/pigeon/test/dart_generator_test.dart
+++ b/packages/pigeon/test/dart_generator_test.dart
@@ -155,8 +155,8 @@
     expect(code, contains('int add(int x, int y)'));
     expect(code,
         contains('final List<Object?> args = (message as List<Object?>?)!'));
-    expect(code, contains('final int? arg_x = args[0] as int?'));
-    expect(code, contains('final int? arg_y = args[1] as int?'));
+    expect(code, contains('final int? arg_x = (args[0] as int?)'));
+    expect(code, contains('final int? arg_y = (args[1] as int?)'));
     expect(code, contains('final int output = api.add(arg_x!, arg_y!)'));
   });
 
@@ -940,7 +940,9 @@
     final String code = sink.toString();
     expect(code, contains('List<int?> doit('));
     expect(
-        code, contains('final List<int?>? arg_foo = args[0] as List<int?>?'));
+        code,
+        contains(
+            'final List<int?>? arg_foo = (args[0] as List<Object?>?)?.cast<int?>()'));
     expect(code, contains('final List<int?> output = api.doit(arg_foo!)'));
   });
 }