[ios_platform_images] Switch to new analysis options (#4784)

diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md
index 443be3f..416f936 100644
--- a/packages/ios_platform_images/CHANGELOG.md
+++ b/packages/ios_platform_images/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.0+4
+
+* Internal code cleanup for stricter analysis options.
+
 ## 0.2.0+3
 
 * Internal fix for unused field formal parameter.
diff --git a/packages/ios_platform_images/analysis_options.yaml b/packages/ios_platform_images/analysis_options.yaml
deleted file mode 100644
index cda4f6e..0000000
--- a/packages/ios_platform_images/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: ../../analysis_options_legacy.yaml
diff --git a/packages/ios_platform_images/example/lib/main.dart b/packages/ios_platform_images/example/lib/main.dart
index 1546edc..ecdfeb2 100644
--- a/packages/ios_platform_images/example/lib/main.dart
+++ b/packages/ios_platform_images/example/lib/main.dart
@@ -18,7 +18,8 @@
   void initState() {
     super.initState();
 
-    IosPlatformImages.resolveURL("textfile").then((value) => print(value));
+    IosPlatformImages.resolveURL('textfile')
+        .then((String? value) => print(value));
   }
 
   @override
@@ -31,7 +32,7 @@
         body: Center(
           // "flutter" is a resource in Assets.xcassets.
           child: Image(
-            image: IosPlatformImages.load("flutter"),
+            image: IosPlatformImages.load('flutter'),
             semanticLabel: 'Flutter logo',
           ),
         ),
diff --git a/packages/ios_platform_images/example/pubspec.yaml b/packages/ios_platform_images/example/pubspec.yaml
index 97241b6..aa8fea5 100644
--- a/packages/ios_platform_images/example/pubspec.yaml
+++ b/packages/ios_platform_images/example/pubspec.yaml
@@ -7,11 +7,10 @@
   flutter: ">=2.5.0"
 
 dependencies:
+  cupertino_icons: ^1.0.2
   flutter:
     sdk: flutter
 
-  cupertino_icons: ^1.0.2
-
 dev_dependencies:
   flutter_test:
     sdk: flutter
@@ -22,7 +21,6 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
-  pedantic: ^1.10.0
 
 flutter:
   uses-material-design: true
diff --git a/packages/ios_platform_images/example/test/widget_test.dart b/packages/ios_platform_images/example/test/widget_test.dart
index 09fa35c..18e9e65 100644
--- a/packages/ios_platform_images/example/test/widget_test.dart
+++ b/packages/ios_platform_images/example/test/widget_test.dart
@@ -14,11 +14,10 @@
     // Build our app and trigger a frame.
     await tester.pumpWidget(MyApp());
 
-    // Verify that platform version is retrieved.
     expect(
       find.byWidgetPredicate(
         (Widget widget) =>
-            widget is Image && (Platform.isIOS ? widget.image != null : true),
+            widget is Image && (!Platform.isIOS || widget.image != null),
       ),
       findsOneWidget,
     );
diff --git a/packages/ios_platform_images/lib/ios_platform_images.dart b/packages/ios_platform_images/lib/ios_platform_images.dart
index 856562c..23a437d 100644
--- a/packages/ios_platform_images/lib/ios_platform_images.dart
+++ b/packages/ios_platform_images/lib/ios_platform_images.dart
@@ -6,18 +6,18 @@
 import 'dart:typed_data';
 import 'dart:ui' as ui;
 
+import 'package:flutter/foundation.dart'
+    show SynchronousFuture, describeIdentity, immutable, objectRuntimeType;
+import 'package:flutter/painting.dart';
 import 'package:flutter/rendering.dart';
 import 'package:flutter/services.dart';
-import 'package:flutter/painting.dart';
-import 'package:flutter/foundation.dart'
-    show SynchronousFuture, describeIdentity;
 
 class _FutureImageStreamCompleter extends ImageStreamCompleter {
   _FutureImageStreamCompleter({
     required Future<ui.Codec> codec,
     required this.futureScale,
   }) {
-    codec.then<void>(_onCodecReady, onError: (dynamic error, StackTrace stack) {
+    codec.then<void>(_onCodecReady, onError: (Object error, StackTrace stack) {
       reportError(
         context: ErrorDescription('resolving a single-frame image stream'),
         exception: error,
@@ -31,8 +31,8 @@
 
   Future<void> _onCodecReady(ui.Codec codec) async {
     try {
-      ui.FrameInfo nextFrame = await codec.getNextFrame();
-      double scale = await futureScale;
+      final ui.FrameInfo nextFrame = await codec.getNextFrame();
+      final double scale = await futureScale;
       setImage(ImageInfo(image: nextFrame.image, scale: scale));
     } catch (exception, stack) {
       reportError(
@@ -47,6 +47,7 @@
 
 /// Performs exactly like a [MemoryImage] but instead of taking in bytes it takes
 /// in a future that represents bytes.
+@immutable
 class _FutureMemoryImage extends ImageProvider<_FutureMemoryImage> {
   /// Constructor for FutureMemoryImage.  [_futureBytes] is the bytes that will
   /// be loaded into an image and [_futureScale] is the scale that will be applied to
@@ -83,11 +84,13 @@
 
   /// See [ImageProvider.operator==].
   @override
-  bool operator ==(dynamic other) {
-    if (other.runtimeType != runtimeType) return false;
-    final _FutureMemoryImage typedOther = other;
-    return _futureBytes == typedOther._futureBytes &&
-        _futureScale == typedOther._futureScale;
+  bool operator ==(Object other) {
+    if (other.runtimeType != runtimeType) {
+      return false;
+    }
+    return other is _FutureMemoryImage &&
+        _futureBytes == other._futureBytes &&
+        _futureScale == other._futureScale;
   }
 
   /// See [ImageProvider.hashCode].
@@ -96,10 +99,11 @@
 
   /// See [ImageProvider.toString].
   @override
-  String toString() =>
-      '$runtimeType(${describeIdentity(_futureBytes)}, scale: $_futureScale)';
+  String toString() => '${objectRuntimeType(this, '_FutureMemoryImage')}'
+      '(${describeIdentity(_futureBytes)}, scale: $_futureScale)';
 }
 
+// ignore: avoid_classes_with_only_static_members
 /// Class to help loading of iOS platform images into Flutter.
 ///
 /// For example, loading an image that is in `Assets.xcassts`.
@@ -114,10 +118,11 @@
   ///
   /// See [https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed?language=objc]
   static ImageProvider load(String name) {
-    Future<Map?> loadInfo = _channel.invokeMapMethod('loadImage', name);
-    Completer<Uint8List> bytesCompleter = Completer<Uint8List>();
-    Completer<double> scaleCompleter = Completer<double>();
-    loadInfo.then((map) {
+    final Future<Map<String, dynamic>?> loadInfo =
+        _channel.invokeMapMethod<String, dynamic>('loadImage', name);
+    final Completer<Uint8List> bytesCompleter = Completer<Uint8List>();
+    final Completer<double> scaleCompleter = Completer<double>();
+    loadInfo.then((Map<String, dynamic>? map) {
       if (map == null) {
         scaleCompleter.completeError(
           Exception("Image couldn't be found: $name"),
@@ -127,8 +132,8 @@
         );
         return;
       }
-      scaleCompleter.complete(map["scale"]);
-      bytesCompleter.complete(map["data"]);
+      scaleCompleter.complete(map['scale']! as double);
+      bytesCompleter.complete(map['data']! as Uint8List);
     });
     return _FutureMemoryImage(bytesCompleter.future, scaleCompleter.future);
   }
@@ -140,6 +145,7 @@
   ///
   /// See [https://developer.apple.com/documentation/foundation/nsbundle/1411540-urlforresource?language=objc]
   static Future<String?> resolveURL(String name, {String? extension}) {
-    return _channel.invokeMethod<String>('resolveURL', [name, extension]);
+    return _channel
+        .invokeMethod<String>('resolveURL', <Object?>[name, extension]);
   }
 }
diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml
index d5aa9ee..fe7952a 100644
--- a/packages/ios_platform_images/pubspec.yaml
+++ b/packages/ios_platform_images/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A plugin to share images between Flutter and iOS in add-to-app setups.
 repository: https://github.com/flutter/plugins/tree/main/packages/ios_platform_images
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+ios_platform_images%22
-version: 0.2.0+3
+version: 0.2.0+4
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/ios_platform_images/test/ios_platform_images_test.dart b/packages/ios_platform_images/test/ios_platform_images_test.dart
index a896e3d..76b0120 100644
--- a/packages/ios_platform_images/test/ios_platform_images_test.dart
+++ b/packages/ios_platform_images/test/ios_platform_images_test.dart
@@ -23,6 +23,6 @@
   });
 
   test('resolveURL', () async {
-    expect(await IosPlatformImages.resolveURL("foobar"), '42');
+    expect(await IosPlatformImages.resolveURL('foobar'), '42');
   });
 }
diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml
index 721e2ef..7ef7969 100644
--- a/script/configs/custom_analysis.yaml
+++ b/script/configs/custom_analysis.yaml
@@ -25,7 +25,6 @@
 - in_app_purchase/in_app_purchase
 - in_app_purchase/in_app_purchase_android
 - in_app_purchase/in_app_purchase_storekit
-- ios_platform_images
 - video_player/video_player
 - video_player/video_player_platform_interface
 - video_player/video_player_web