[in_app_purchase] Initialize SKError with correct data type (#4113)

diff --git a/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md
index acbe995..d10edc9 100644
--- a/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md
+++ b/packages/in_app_purchase/in_app_purchase_ios/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.2+1
+
+* Fix wrong data type when cancelling user credentials dialog.
+
 ## 0.1.2
 
 * Added countryCode to the SKPriceLocaleWrapper.
@@ -12,7 +16,7 @@
 
 ## 0.1.0+2
 
-* Changed the iOS payment queue handler in such a way that it only adds a listener to the `SKPaymentQueue` when there 
+* Changed the iOS payment queue handler in such a way that it only adds a listener to the `SKPaymentQueue` when there
   is a listener to the Dart `purchaseStream`.
 
 ## 0.1.0+1
diff --git a/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
index c39ad9e..079e750 100644
--- a/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
+++ b/packages/in_app_purchase/in_app_purchase_ios/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart
@@ -66,7 +66,7 @@
   /// addTransactionObserver:]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506042-addtransactionobserver?language=objc).
   void setTransactionObserver(SKTransactionObserverWrapper observer) {
     _observer = observer;
-    channel.setMethodCallHandler(_handleObserverCallbacks);
+    channel.setMethodCallHandler(handleObserverCallbacks);
   }
 
   /// Instructs the iOS implementation to register a transaction observer and
@@ -208,8 +208,12 @@
         .invokeMethod<void>('-[SKPaymentQueue showPriceConsentIfNeeded]');
   }
 
-  // Triage a method channel call from the platform and triggers the correct observer method.
-  Future<dynamic> _handleObserverCallbacks(MethodCall call) async {
+  /// Triage a method channel call from the platform and triggers the correct observer method.
+  ///
+  /// This method is public for testing purposes only and should not be used
+  /// outside this class.
+  @visibleForTesting
+  Future<dynamic> handleObserverCallbacks(MethodCall call) async {
     assert(_observer != null,
         '[in_app_purchase]: (Fatal)The observer has not been set but we received a purchase transaction notification. Please ensure the observer has been set using `setTransactionObserver`. Make sure the observer is added right at the App Launch.');
     final SKTransactionObserverWrapper observer = _observer!;
@@ -232,7 +236,8 @@
         }
       case 'restoreCompletedTransactionsFailed':
         {
-          SKError error = SKError.fromJson(call.arguments);
+          SKError error =
+              SKError.fromJson(Map<String, dynamic>.from(call.arguments));
           return Future<void>(() {
             observer.restoreCompletedTransactionsFailed(error: error);
           });
diff --git a/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml
index b73ad84..69afe52 100644
--- a/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml
+++ b/packages/in_app_purchase/in_app_purchase_ios/pubspec.yaml
@@ -2,7 +2,7 @@
 description: An implementation for the iOS platform of the Flutter `in_app_purchase` plugin. This uses the iOS StoreKit Framework.
 repository: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase/in_app_purchase_ios
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
-version: 0.1.2
+version: 0.1.2+1
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart b/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart
index b61411d..ca2b336 100644
--- a/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart
+++ b/packages/in_app_purchase/in_app_purchase_ios/test/store_kit_wrappers/sk_payment_queue_delegate_api_test.dart
@@ -68,6 +68,65 @@
       },
     );
   });
+
+  test(
+      'handleObserverCallbacks should call SKTransactionObserverWrapper.restoreCompletedTransactionsFailed',
+      () async {
+    SKPaymentQueueWrapper queue = SKPaymentQueueWrapper();
+    TestTransactionObserverWrapper testObserver =
+        TestTransactionObserverWrapper();
+    queue.setTransactionObserver(testObserver);
+
+    final arguments = <dynamic, dynamic>{
+      'code': 100,
+      'domain': 'domain',
+      'userInfo': <String, dynamic>{'error': 'underlying_error'},
+    };
+
+    await queue.handleObserverCallbacks(
+      MethodCall('restoreCompletedTransactionsFailed', arguments),
+    );
+
+    expect(
+      testObserver.log,
+      <Matcher>{
+        equals('restoreCompletedTransactionsFailed'),
+      },
+    );
+  });
+}
+
+class TestTransactionObserverWrapper extends SKTransactionObserverWrapper {
+  final List<String> log = <String>[];
+
+  @override
+  void updatedTransactions(
+      {required List<SKPaymentTransactionWrapper> transactions}) {
+    log.add('updatedTransactions');
+  }
+
+  @override
+  void removedTransactions(
+      {required List<SKPaymentTransactionWrapper> transactions}) {
+    log.add('removedTransactions');
+  }
+
+  @override
+  void restoreCompletedTransactionsFailed({required SKError error}) {
+    log.add('restoreCompletedTransactionsFailed');
+  }
+
+  @override
+  void paymentQueueRestoreCompletedTransactionsFinished() {
+    log.add('paymentQueueRestoreCompletedTransactionsFinished');
+  }
+
+  @override
+  bool shouldAddStorePayment(
+      {required SKPaymentWrapper payment, required SKProductWrapper product}) {
+    log.add('shouldAddStorePayment');
+    return false;
+  }
 }
 
 class TestPaymentQueueDelegate extends SKPaymentQueueDelegateWrapper {