Migrating from v6 to v7
Version 7.0.0 introduces breaking API changes to align with OpenIAP standards and improve developer experience with named parameters.
Overview of Changes
1. Named Parameters API
All main methods now use named parameters instead of object-based parameters for a cleaner, more intuitive API.
2. Simplified finishTransaction
The finishTransaction
method now accepts the Purchase
object directly instead of individual fields.
3. Simplified RequestPurchaseProps
Removed sealed class structure in favor of a simpler direct structure.
4. New AlternativeBillingModeAndroid
Added support for alternative billing modes on Android.
Migration Steps
fetchProducts
Before (v6.x):
final result = await FlutterInappPurchase.instance.fetchProducts(
ProductRequest(
skus: ['product_id'],
type: ProductQueryType.InApp,
),
);
After (v7.0):
final result = await FlutterInappPurchase.instance.fetchProducts(
skus: ['product_id'],
type: ProductQueryType.InApp,
);
getAvailablePurchases
Before (v6.x):
// Using PurchaseOptions object
final purchases = await FlutterInappPurchase.instance.getAvailablePurchases(
PurchaseOptions(
onlyIncludeActiveItemsIOS: true,
alsoPublishToEventListenerIOS: false,
),
);
After (v7.0):
// Using named parameters directly
final purchases = await FlutterInappPurchase.instance.getAvailablePurchases(
onlyIncludeActiveItemsIOS: true,
alsoPublishToEventListenerIOS: false,
);
finishTransaction
Before (v6.x):
await FlutterInappPurchase.instance.finishTransaction(
id: purchase.id,
isAutoRenewing: purchase.isAutoRenewing,
platform: purchase.platform,
productId: purchase.productId,
purchaseState: purchase.purchaseState,
purchaseToken: purchase.purchaseToken,
quantity: purchase.quantity,
transactionDate: purchase.transactionDate,
isConsumable: true,
);
After (v7.0):
await FlutterInappPurchase.instance.finishTransaction(
purchase: purchase,
isConsumable: true,
);
validateReceipt (iOS)
Before (v6.x):
final result = await FlutterInappPurchase.instance.validateReceiptIOS(
ReceiptValidationProps(sku: 'product_id'),
);
After (v7.0):
final result = await FlutterInappPurchase.instance.validateReceiptIOS(
sku: 'product_id',
);
initConnection
Before (v6.x):
await FlutterInappPurchase.instance.initConnection();
After (v7.0):
await FlutterInappPurchase.instance.initConnection(
alternativeBillingModeAndroid: AlternativeBillingModeAndroid.None, // Optional
);
deepLinkToSubscriptions
Before (v6.x):
await FlutterInappPurchase.instance.deepLinkToSubscriptions(
DeepLinkOptions(sku: 'subscription_id'),
);
After (v7.0):
await FlutterInappPurchase.instance.deepLinkToSubscriptions(
skuAndroid: 'subscription_id',
);
Removed iOS-Specific Methods
The following iOS-specific methods have been removed in v7.0. Use the standard OpenIAP-compliant methods instead:
getAvailableItemsIOS()
Before (v6.x):
final purchases = await FlutterInappPurchase.instance.getAvailableItemsIOS();
After (v7.0):
// Use the standard getAvailablePurchases() method
final purchases = await FlutterInappPurchase.instance.getAvailablePurchases();
getAppTransactionTypedIOS()
Before (v6.x):
final appTransaction = await FlutterInappPurchase.instance.getAppTransactionTypedIOS();
After (v7.0):
// Use getAppTransactionIOS() directly
final appTransaction = await FlutterInappPurchase.instance.getAppTransactionIOS();
getPurchaseHistoriesIOS()
Before (v6.x):
final histories = await FlutterInappPurchase.instance.getPurchaseHistoriesIOS();
After (v7.0):
// Use getAvailablePurchases() with options to include expired items
final histories = await FlutterInappPurchase.instance.getAvailablePurchases(
onlyIncludeActiveItemsIOS: false,
alsoPublishToEventListenerIOS: true,
);
RequestPurchaseProps
Before (v6.x):
// Using factory methods
final props = RequestPurchaseProps.inApp(
request: RequestPurchasePropsByPlatforms(
ios: RequestPurchaseIosProps(sku: 'product_id'),
android: RequestPurchaseAndroidProps(skus: ['product_id']),
),
);
final subsProps = RequestPurchaseProps.subs(
request: RequestSubscriptionPropsByPlatforms(
ios: RequestSubscriptionIosProps(sku: 'sub_id'),
android: RequestSubscriptionAndroidProps(skus: ['sub_id']),
),
);
After (v7.0):
// Direct constructor with type parameter
final props = RequestPurchaseProps(
request: RequestPurchasePropsByPlatforms(
ios: RequestPurchaseIosProps(sku: 'product_id'),
android: RequestPurchaseAndroidProps(skus: ['product_id']),
),
type: ProductQueryType.InApp,
);
final subsProps = RequestPurchaseProps(
request: RequestPurchasePropsByPlatforms(
ios: RequestPurchaseIosProps(sku: 'sub_id'),
android: RequestPurchaseAndroidProps(skus: ['sub_id']),
),
type: ProductQueryType.Subs,
);
Benefits of v7.0
Cleaner API
Named parameters make the API more intuitive and self-documenting:
// Clear and concise
await iap.fetchProducts(
skus: ['product1', 'product2'],
type: ProductQueryType.InApp,
);
Reduced Boilerplate
Finishing transactions is now much simpler:
// Just pass the purchase object
await iap.finishTransaction(
purchase: purchase,
isConsumable: true,
);
Type Safety
Direct constructor usage provides better type safety and IDE autocomplete support.
Better OpenIAP Alignment
The new API structure aligns better with the OpenIAP specification.
Breaking Changes Checklist
- Update all
fetchProducts
calls to use named parameters - Update all
getAvailablePurchases
calls to use named parameters - Update all
finishTransaction
calls to passPurchase
object - Update all
validateReceiptIOS
calls to use named parameters - Update all
deepLinkToSubscriptions
calls to use named parameters - Replace
RequestPurchaseProps.inApp()
with direct constructor +type
parameter - Replace
RequestPurchaseProps.subs()
with direct constructor +type
parameter - Remove
RequestSubscriptionPropsByPlatforms
usage (useRequestPurchasePropsByPlatforms
instead) - Replace
getAvailableItemsIOS()
withgetAvailablePurchases()
- Replace
getAppTransactionTypedIOS()
withgetAppTransactionIOS()
- Replace
getPurchaseHistoriesIOS()
withgetAvailablePurchases()
with options - Test all purchase flows thoroughly
Need Help?
If you encounter issues during migration:
- Check the API Reference for detailed method signatures
- Review the Examples for updated code patterns
- Open an issue on GitHub