purchases_flutter 1.2.1 purchases_flutter: ^1.2.1 copied to clipboard
A Flutter plugin that makes implementing in-app subscriptions for iOS and Android simple – receipt validation and status tracking included!
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:purchases_flutter/purchases_flutter.dart';
void main() {
runApp(MaterialApp(
title: 'RevenueCat Sample',
home: InitialScreen(),
));
}
class InitialScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => _MyAppState();
}
class _MyAppState extends State<InitialScreen> {
PurchaserInfo _purchaserInfo;
Offerings _offerings;
@override
void initState() {
super.initState();
initPlatformState();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
await Purchases.setDebugLogsEnabled(true);
await Purchases.setup("api_key");
await Purchases.addAttributionData({}, PurchasesAttributionNetwork.facebook);
PurchaserInfo purchaserInfo = await Purchases.getPurchaserInfo();
Offerings offerings = await Purchases.getOfferings();
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_purchaserInfo = purchaserInfo;
_offerings = offerings;
});
}
@override
Widget build(BuildContext context) {
if (_purchaserInfo == null) {
return Scaffold(
appBar: AppBar(title: Text("RevenueCat Sample App")),
body: Center(
child: Text("Loading..."),
),
);
} else {
var isPro = _purchaserInfo.entitlements.active.containsKey("pro_cat");
if (isPro) {
return CatsScreen();
} else {
return UpsellScreen(
offerings: _offerings,
);
}
}
}
}
class UpsellScreen extends StatelessWidget {
final Offerings offerings;
UpsellScreen({Key key, @required this.offerings}) : super(key: key);
@override
Widget build(BuildContext context) {
if (offerings != null) {
final offering = offerings.current;
if (offering != null) {
final monthly = offering.monthly;
final lifetime = offering.lifetime;
if (monthly != null && lifetime != null) {
return Scaffold(
appBar: AppBar(title: Text("Upsell Screen")),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
PurchaseButton(package: monthly),
PurchaseButton(package: lifetime)
],
)));
}
}
}
return Scaffold(
appBar: AppBar(title: Text("Upsell Screen")),
body: Center(
child: Text("Loading..."),
));
}
}
class PurchaseButton extends StatelessWidget {
final Package package;
PurchaseButton({Key key, @required this.package}) : super(key: key);
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () async {
try {
PurchaserInfo purchaserInfo =
await Purchases.purchasePackage(package);
var isPro = purchaserInfo.entitlements.all["pro_cat"].isActive;
if (isPro) {
return CatsScreen();
}
} on PlatformException catch (e) {
var errorCode = PurchasesErrorHelper.getErrorCode(e);
if (errorCode == PurchasesErrorCode.purchaseCancelledError) {
print("User cancelled");
} else if (errorCode == PurchasesErrorCode.purchaseNotAllowedError) {
print("User not allowed to purchase");
}
}
return InitialScreen();
},
child: Text("Buy - (${package.product.priceString})"),
);
}
}
class CatsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Cats Screen")),
body: Center(
child: Text("User is pro"),
));
}
}