PaywallPresentationHandler
A handler class that provides status updates for paywall presentation in registerPlacement() calls.
Use this handler when you need fine-grained control over paywall events for a specific registerPlacement() call, rather than global events via SuperwallDelegate.
This handler is specific to the individual registerPlacement() call. For global paywall events across your app, use SuperwallDelegate instead.
Purpose
Provides callbacks for paywall lifecycle events when using registerPlacement() with a specific handler instance.
Signature
class PaywallPresentationHandler {
void onPresent(Function(PaywallInfo) handler);
void onDismiss(Function(PaywallInfo, PaywallResult) handler);
void onSkip(Function(PaywallSkippedReason) handler);
void onError(Function(String) handler);
}Parameters
| Method | Parameters | Description |
|---|---|---|
onPresent | handler: (PaywallInfo) -> void | Sets a handler called when the paywall is presented. |
onDismiss | handler: (PaywallInfo, PaywallResult) -> void | Sets a handler called when the paywall is dismissed. |
onSkip | handler: (PaywallSkippedReason) -> void | Sets a handler called when paywall presentation is skipped. |
onError | handler: (String) -> void | Sets a handler called when an error occurs during presentation. |
Returns / State
Each method returns void and configures the handler for the specific paywall lifecycle event.
Usage
Basic handler setup:
Future<void> _registerFeatureWithHandler() async {
final handler = PaywallPresentationHandler();
handler.onPresent((paywallInfo) {
print('Paywall presented: ${paywallInfo.identifier}');
// Pause background tasks, analytics, etc.
});
handler.onDismiss((paywallInfo, result) {
print('Paywall dismissed with result: $result');
switch (result) {
case PaywallResult.purchased:
_showSuccessMessage();
break;
case PaywallResult.cancelled:
_showPromotionalOffer();
break;
case PaywallResult.restored:
_updateUIForActiveSubscription();
break;
}
});
await Superwall.shared.registerPlacement(
'premium_feature',
params: {'source': 'feature_screen'},
handler: handler,
feature: () {
_unlockPremiumFeature();
},
);
}Handle skip and error cases:
Future<void> _setupComprehensiveHandler() async {
final handler = PaywallPresentationHandler();
handler.onSkip((reason) {
print('Paywall skipped: $reason');
switch (reason) {
case PaywallSkippedReason.userIsSubscribed:
_proceedToFeature();
break;
case PaywallSkippedReason.holdout:
_proceedToFeature();
break;
default:
break;
}
});
handler.onError((error) {
print('Paywall error: $error');
_showErrorDialog(error);
});
await Superwall.shared.registerPlacement(
'remove_ads',
handler: handler,
feature: () {
_hideAdsFromUI();
},
);
}Reusable handler class:
class ReusablePaywallHandler {
static PaywallPresentationHandler create({
VoidCallback? onSuccess,
VoidCallback? onCancel,
}) {
final handler = PaywallPresentationHandler();
handler.onPresent((_) {
// Analytics tracking
Analytics.track('paywall_presented');
});
handler.onDismiss((_, result) {
switch (result) {
case PaywallResult.purchased:
onSuccess?.call();
break;
case PaywallResult.cancelled:
onCancel?.call();
break;
default:
break;
}
});
return handler;
}
}
// Usage
final handler = ReusablePaywallHandler.create(
onSuccess: () => Navigator.pushNamed(context, '/premium'),
onCancel: () => _showRetentionOffer(),
);How is this guide?