checkPurchase static method
Future<void>
checkPurchase({
- required BaseSettings settings,
- List<
String> productIds = const [], - List<
String> subscriptionIds = const [], - void onCompleted()?,
Checks previous purchases and queries product details.
Updates settings.unlockFeatures with the purchase status of requested IDs.
Implementation
static Future<void> checkPurchase({
required BaseSettings settings,
List<String> productIds = const [],
List<String> subscriptionIds = const [],
void Function()? onCompleted,
}) async {
final List<String> purchasedIds = [];
final Set<String> allProductIds = {...productIds};
final Set<String> allSubscriptionIds = {...subscriptionIds};
try {
if (!await _iap.isAvailable()) {
onCompleted?.call();
return;
}
// Handle Cross-platform past purchases
if (defaultTargetPlatform == TargetPlatform.android) {
final addition = _iap.getPlatformAddition<InAppPurchaseAndroidPlatformAddition>();
final purchases = await addition.queryPastPurchases();
final allIds = {...allProductIds, ...allSubscriptionIds};
purchasedIds.addAll(
purchases.pastPurchases
.where((p) => allIds.contains(p.productID))
.map((p) => p.productID),
);
}
final Set<String> idList = {...allProductIds, ...allSubscriptionIds};
if (idList.isNotEmpty) {
final response = await _iap.queryProductDetails(idList);
if (response.error != null) {
LoggerUtil.d('Error fetching product details: ${response.error}');
} else {
products = response.productDetails;
}
}
} catch (e) {
LoggerUtil.d('Error in checkPurchase: $e');
} finally {
settings.unlockFeatures = {for (var id in allProductIds) id: purchasedIds.contains(id)};
settings.subscriptions = {for (var id in allSubscriptionIds) id: purchasedIds.contains(id)};
onCompleted?.call();
}
}