LinkFive - Successful Subscriptions

Show your Subscription Offer

Show your Subscription Offer

Please read How to initialize the plugin before you start with this part.

If the user has no active subscriptions, you would want to fetch all available subscriptions you configured in the “Playout section“ of LinkFive - if you did not configured it yet, no worries, all connected subscriptions will be fetched.

Fetch your Subscriptions Offer

To fetch all available subscriptions, call fetchProducts(). It's usually enough to call it once when the user enters the paywall or even once after every app start if the user has no active subscriptions yet.


This will connect to LinkFive and fetch all available subscriptions you configured with the “Subscription Playout“. If you created a subscription playout filter, then it will automatically fetch the filtered subscriptions to the user.

The subscriptions will then be passed to the “SubscriptionData“ stream.

Get Subscriptions Stream

You will get the stream by listening on the SubscriptionData

void _productsUpdate(LinkFiveProducts data) {
// access LinkFiveProducts data

LinkFiveProducts includes a list of ProductDetails and attributes. You can use the ProductDetails to show the price, the duration and everything related to it.

// available variables of LinkFiveProducts
List<LinkFiveProductDetails> productDetailList;
String? attributes;
  • LinkFiveProductDetails: id, title, price, description, duration, rawPrice & currencyCode

  • attributes: Data defined in “Subscription Playout“. You can pass any data you like to the app with the attributes. Attributes are Base64 encoded. Please decode first.

As an example, you can use the map method to build a button for each of your subscriptions
(data) => SubscriptionButton(linkFiveProductDetails: data)

And you can access the price by accessing the productDetails

productDetailList ... productDetails.price

Provider Example

A simple provider example on how to listen on active subscriptions and on subscriptionData:

class LinkFiveProvider extends ChangeNotifier {
final LinkFivePurchasesMain linkFivePurchases = LinkFivePurchasesMain();
LinkFiveProducts? products;
LinkFiveActiveProducts? activeProducts;
List<StreamSubscription> _streams = [];
List<LinkFivePlan> get activePlanList => activeProducts?.planList ?? [];
bool get hasActiveProduct => activeProducts != null && activeProducts!.planList.isNotEmpty;
LinkFiveProvider(String apiKey) {
void _productsUpdate(LinkFiveProducts data) {
products = data;
void _activeProductsUpdate(LinkFiveActiveProducts data) {
activeProducts = data;
Future<LinkFiveProducts?> fetchProducts() {
return LinkFivePurchases.fetchProducts();
restoreSubscriptions() {
return LinkFivePurchases.restore();
Future<bool> purchase(ProductDetails productDetail) async {
return LinkFivePurchases.purchase(productDetail);
void dispose() async {
for (var element in _streams) {
await element.cancel();
_streams = [];

StreamBuilder Example

If you want to use a simple StreamBuilder, you can just pass the stream and wait for the snapshot to arrive.

child: StreamBuilder<LinkFiveProducts>(
stream: LinkFivePurchases.products,
builder: (context, snapshot) {
if (snapshot.hasData) {
var subscriptionData =;
if (subscriptionData != null) {
return Column(
children: [
children: buildSubscriptionButtons(subscriptionData),
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
return Center(child: Text('Loading...'));

Next: Make a purchase