Flutter storefront adapter
Handle StoreKit 2 and Google Play purchase streams in Flutter.
Download this chapterOn this page
The optional appvision_iap_flutter package connects Flutter's official in_app_purchase plugin to the appvision_iap_client Dart core. Its current package version is 0.3.0 and it consumes core 0.5.0. The adapter requires Dart 3.12 and Flutter 3.44 or later according to the checked-in manifest.
Add source dependencies
Public pub.dev publication is disabled in this preview. With an approved local source checkout, configure your app's paths and override the core package consistently:
dependencies:
flutter:
sdk: flutter
in_app_purchase: ^3.3.0
appvision_iap_flutter:
path: ../cherrysub/sdk/flutter
dependency_overrides:
appvision_iap_client:
path: ../cherrysub/sdk/dartAdjust paths to your project. Run flutter pub get. The Flutter adapter re-exports the core SDK; it does not replace your app's billing UI or authenticated backend.
Configure the Dart client
Use an InMemoryCustomerTokenProvider and IapClient as shown in the Dart guide, importing:
import 'package:appvision_iap_flutter/appvision_iap_flutter.dart';
import 'package:in_app_purchase/in_app_purchase.dart';Use iap_pk_ and your authenticated token broker. Load iap.currentProductSet(user.id), keep packages for the current platform, and resolve their store product details using the purchase plugin.
Process the purchase stream
Subscribe to the plugin's purchase updates for both newly purchased and restored transactions. Handle pending/error/cancel states in your UI without treating them as verified access.
for (final PurchaseDetails purchase in purchases) {
if (purchase.status == PurchaseStatus.purchased ||
purchase.status == PurchaseStatus.restored) {
await iap.submitAndCompletePurchaseDetails(
appUserId: user.id,
purchase: purchase,
googleProductType: purchase.verificationData.source == 'google_play'
? GoogleProductType.subscription
: null,
);
}
}Replace subscription with the correct product type for a Google one-time product; this example is a subscription handler.
Store-specific evidence and completion
Apple purchases must be SK2PurchaseDetails, whose server verification data is the StoreKit transaction JWS. A StoreKit 1 purchase detail is not an interchangeable payload. Google purchases must be GooglePlayPurchaseDetails, whose server data is the purchase token.
Only purchased and restored are accepted. completePurchase runs after the backend accepts the evidence, and failure leaves the transaction unfinished for recovery. Do not independently complete the same purchase earlier in another callback.
After acceptance, fetch the subscriber and update your UI from its access map. Your app owns consumable policy, stream subscription cleanup, and presentation of unavailable products or store errors.
Authentication and account changes
The core provider caches per authenticated user and refreshes before expiry. Invalidate the departing user on logout, clear local access UI, and obtain a new token for the next account before restoring purchases. If your policy requires token revocation, perform it on the backend too.
No SDK customer token is persisted automatically. Do not store an iap_sk_ or service-account JSON in Flutter assets or compile-time client defines.
Validate
Run the adapter's flutter test and the core Dart tests when modifying source integration. Test Apple StoreKit 2 and Google Play separately, including restored/pending purchases, backend failure before completion, one-time versus subscription product type, and logout during token refresh. Purchase lifecycle · Testing.