extractPurchases function

List<Purchase> extractPurchases(
  1. dynamic result, {
  2. required bool platformIsAndroid,
  3. required bool platformIsIOS,
  4. required Map<String, bool> acknowledgedAndroidPurchaseTokens,
})

Implementation

List<gentype.Purchase> extractPurchases(
  dynamic result, {
  required bool platformIsAndroid,
  required bool platformIsIOS,
  required Map<String, bool> acknowledgedAndroidPurchaseTokens,
}) {
  List<dynamic> list;
  if (result is String) {
    list = json.decode(result) as List<dynamic>;
  } else if (result is List) {
    list = result;
  } else {
    list = json.decode(result.toString()) as List<dynamic>;
  }

  final purchases = <gentype.Purchase>[];
  for (final dynamic product in list) {
    try {
      if (product is! Map) {
        debugPrint(
          '[flutter_inapp_purchase] Skipping purchase with unexpected type: ${product.runtimeType}',
        );
        continue;
      }
      // Safely convert map keys to strings to handle cases where platform channels
      // return maps with non-string keys (e.g., Map<Object?, Object?>)
      final map = product.map<String, dynamic>(
          (key, value) => MapEntry(key.toString(), value));
      final original = map; // originalJson은 변환된 데이터를 사용 (추가 필드 접근을 위해)
      purchases.add(
        convertToPurchase(
          map,
          originalJson: original,
          platformIsAndroid: platformIsAndroid,
          platformIsIOS: platformIsIOS,
          acknowledgedAndroidPurchaseTokens: acknowledgedAndroidPurchaseTokens,
        ),
      );
    } catch (error) {
      debugPrint(
        '[flutter_inapp_purchase] Skipping purchase due to parse error: $error',
      );
    }
  }

  return purchases;
}