Encore Flutter SDK
Flutter plugin wrapping the native Encore iOS and Android SDKs. All offer UI is rendered natively — this plugin bridges configuration, identity, placement presentation, and callback handling via platform channels.
Installation
Add to your pubspec.yaml:
dependencies:
encore: ^1.0.0
iOS
The plugin depends on EncoreKit via CocoaPods. Your app's ios/Podfile must include the EncoreKit pod source. The plugin's podspec handles the dependency automatically.
Minimum deployment target: iOS 15.0.
Android
The plugin depends on com.encorekit:encore via Maven. Add the EncoreKit Maven repository to your app's android/build.gradle:
allprojects {
repositories {
google()
mavenCentral()
maven { url = uri("https://maven.pkg.github.com/EncoreKit/android") }
}
}
Minimum SDK: 21.
Usage
Configure
Call once early in your app lifecycle (e.g., in main() or your root widget's initState):
import 'package:encore/encore.dart';
await Encore.shared.configure(
apiKey: 'your_api_key',
logLevel: LogLevel.debug,
);
Register Handlers
Set up handlers before presenting offers:
Encore.shared.onPurchaseRequest((purchaseRequest) {
// Purchase Request includes:
// purchaseRequest.productId
// purchaseRequest.promoId
// purchaseRequest.placementId
// Trigger purchase via your subscription manager (RevenueCat, etc.)
});
Encore.shared.onPassthrough((placementId) {
// Encore didn't result in a purchase — run your original button logic
});
// Optional: only fires when no onPurchaseRequest handler is set
Encore.shared.onPurchaseComplete((result, productId) {
print('Native purchase completed: ${result.productId}');
});
Identify User
After authentication:
await Encore.shared.identify(
userId: 'user_123',
attributes: UserAttributes(
email: 'user@example.com',
subscriptionTier: 'premium',
),
);
Update Attributes
await Encore.shared.setUserAttributes(
UserAttributes(billingCycle: 'annual'),
);
Present Offers
final result = await Encore.shared.placement('cancel_flow').show();
switch (result) {
case PresentationResultGranted(:final offerId):
print('Offer granted: $offerId');
case PresentationResultNotGranted(:final reason):
print('Not granted: $reason');
}
Reset (Logout)
await Encore.shared.reset();
Architecture
Flutter App
│
▼
┌─────────────────────────────┐
│ Encore Dart API │
│ (lib/src/encore.dart) │
├─────────────────────────────┤
│ MethodChannel │
│ com.encorekit/encore │
├──────────────┬──────────────┤
│ iOS Plugin │ Android Plugin│
│ (Swift) │ (Kotlin) │
├──────────────┼──────────────┤
│ Encore │ com.encorekit│
│ .xcframework│ :encore AAR │
└──────────────┴──────────────┘
The Dart layer sends method calls to the native plugins, which delegate to the native Encore SDK singletons. Native-to-Dart callbacks (purchase requests, passthrough) are forwarded via reverse method invocations on the same channel.
API Reference
| Method | Description |
|---|---|
Encore.shared.configure(apiKey:, logLevel:) |
Initialize the SDK |
Encore.shared.identify(userId:, attributes:) |
Associate user identity |
Encore.shared.setUserAttributes(attributes) |
Merge user attributes |
Encore.shared.reset() |
Clear user data (logout) |
Encore.shared.placement(id).show() |
Present native offer sheet |
Encore.shared.onPurchaseRequest(handler) |
Handle purchase delegation |
Encore.shared.onPurchaseComplete(handler) |
Handle native purchase completion |
Encore.shared.onPassthrough(handler) |
Handle not-granted outcomes |
Libraries
- encore
- Flutter plugin wrapping the native Encore iOS and Android SDKs.