flutter_inapp_purchase 0.1.0 copy "flutter_inapp_purchase: ^0.1.0" to clipboard
flutter_inapp_purchase: ^0.1.0 copied to clipboard

outdatedDart 1 only

In App Purchase plugin for flutter.

flutter_inapp #

In App Purchase plugin for flutter. This project has been forked from react-native-iap. We are trying to have same experience of in-app-purchase in flutter as in react-native. Since dooboolab is working alone currently, need much improvement with the testing and maintenance. We will keep working on it as time goes by just like we did in react-native-iap. PR is always welcomed.

Getting Started #

For help getting started with Flutter, view our online documentation.

For help on editing plugin code, view the documentation.

Methods #

Func Param Return Description
prepare String Prepare IAP module. Must be called on Android before any other purchase flow methods. In ios, it will simply call canMakePayments method and return value.
getProducts List<String> Product IDs/skus List<IAPItem> Get a list of products (consumable and non-consumable items, but not subscriptions). Note: On iOS versions earlier than 11.2 this method will return subscriptions if they are included in your list of SKUs. This is because we cannot differentiate between IAP products and subscriptions prior to 11.2.
getSubscriptions List<String> Subscription IDs/skus List<IAPItem> Get a list of subscriptions. Note: On iOS this method has the same output as getProducts. Because iOS does not differentiate between IAP products and subscriptions.
getPurchaseHistory List<IAPItem> Gets an invetory of purchases made by the user regardless of consumption status (where possible)
getAvailablePurchases List<IAPItem> Get all purchases made by the user (either non-consumable, or haven't been consumed yet)
buySubscription string Subscription ID/sku, string Old Subscription ID/sku (on Android) json Create (buy) a subscription to a sku. For upgrading/downgrading subscription on Android pass second parameter with current subscription ID, on iOS this is handled automatically by store.
buyProduct string Product ID/sku json Buy a product
buyProductWithoutFinishTransaction string Product ID/sku json Buy a product without finish transaction call (iOS only)
finishTransaction void String Send finishTransaction call to Apple IAP server. Call this function after receipt validation process
consumePurchase String Purchase token String Consume a product (on Android.) No-op on iOS.
endConnection String End billing connection (on Android.) No-op on iOS.

Install #

Add flutter_iap as a dependency in pubspec.yaml

For help on adding as a dependency, view the documentation.

Configuring in app purchase #

  • Please refer to Blog.

Example #

Below code is just a cp from example project. You can test this in real example project.

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';

import 'package:flutter/services.dart';
import 'package:flutter_inapp/flutter_inapp.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final List<String>_productLists = Platform.isAndroid
    ? [
      'android.test.purchased',
      'point_1000',
      '5000_point',
      'android.test.canceled',
    ]
    : ['com.cooni.point1000','com.cooni.point5000'];

  String _platformVersion = 'Unknown';
  List<IAPItem> _items = [];

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    String platformVersion;
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      platformVersion = await FlutterInapp.platformVersion;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // prepare
    var result = await FlutterInapp.prepare;
    print ('result: $result');

    // 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(() {
      _platformVersion = platformVersion;
    });
  }

  Future<Null> _buyProduct(IAPItem item) async {
    try {
      var bought = await FlutterInapp.buyProduct(item.productId);
      print('bought - ${bought.toString()}');
    } catch (error) {
      print('$error');
    }

  }

  Future<Null> _getProduct() async {
    List<IAPItem> items = await FlutterInapp.getProducts(_productLists);
    for (var item in items) {
      print('${item.toString()}');
      this._items.add(item);
    }

    setState(() {
      this._items = items;
    });
  }

  _renderInapps() {
    List<Widget> widgets = this._items.map((item) => Container(
      margin: EdgeInsets.symmetric(vertical: 10.0),
      child: Container(
        child: Column(
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(bottom: 5.0),
              child: Text(
                item.toString(),
                style: TextStyle(
                  fontSize: 18.0,
                  color: Colors.black,
                ),
              ),
            ),
            FlatButton(
              color: Colors.orange,
              onPressed: () {
                this._buyProduct(item);
              },
              child: Row(
                children: <Widget>[
                  Expanded(
                    child: Container(
                      height: 48.0,
                      alignment: Alignment(-1.0, 0.0),
                      child: Text('Buy Item'),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    )).toList();
    return widgets;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Inapp Plugin by dooboolab'),
        ),
        body:
          Container(
            padding: EdgeInsets.all(10.0),
            child: ListView(
              children: <Widget>[
                Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                    Container(
                      child: Text(
                        'Running on: $_platformVersion\n',
                        style: TextStyle(
                            fontSize: 18.0
                        ),
                      ),
                    ),
                    Container(
                      height: 60.0,
                      margin: EdgeInsets.only(bottom: 10.0),
                      child: ListView(
                        scrollDirection: Axis.horizontal,
                        children: <Widget>[
                          Row(
                            children: <Widget>[
                              Container(
                                margin: EdgeInsets.symmetric(horizontal: 15.0),
                                child: FlatButton(
                                  color: Colors.green,
                                  padding: EdgeInsets.all(0.0),
                                  onPressed: () async {
                                    await FlutterInapp.prepare;
                                  },
                                  child: Container(
                                    padding: EdgeInsets.symmetric(horizontal: 20.0),
                                    alignment: Alignment(0.0, 0.0),
                                    child: Text(
                                      'Connect Billing',
                                      style: TextStyle(
                                        fontSize: 16.0,
                                      ),
                                    ),
                                  ),
                                ),
                              ),
                              FlatButton(
                                color: Colors.green,
                                padding: EdgeInsets.all(0.0),
                                onPressed: () {
                                  this._getProduct();
                                },
                                child: Container(
                                  padding: EdgeInsets.symmetric(horizontal: 20.0),
                                  alignment: Alignment(0.0, 0.0),
                                  child: Text(
                                    'Get Items',
                                    style: TextStyle(
                                      fontSize: 16.0,
                                    ),
                                  ),
                                ),
                              ),
                              Container(
                                margin: EdgeInsets.only(left: 15.0),
                                child: FlatButton(
                                  color: Colors.green,
                                  padding: EdgeInsets.all(0.0),
                                  onPressed: () async {
                                    await FlutterInapp.endConnection;
                                    setState(() {
                                      this._items = [];
                                    });
                                  },
                                  child: Container(
                                    padding: EdgeInsets.symmetric(horizontal: 20.0),
                                    alignment: Alignment(0.0, 0.0),
                                    child: Text(
                                      'End Connection',
                                      style: TextStyle(
                                        fontSize: 16.0,
                                      ),
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                    Column(
                      children: this._renderInapps(),
                    ),
                  ],
                ),
              ],
            ),
          ),
      ),
    );
  }
}