Flutter应用内购买插件flutter_store_kit的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter应用内购买插件flutter_store_kit的使用

FlutterStoreKit 是一个用于管理应用内购买和订阅的Flutter库。本文档将详细介绍如何在您的Flutter应用中使用 FlutterStoreKit 库。

1. 初始化商店

首先,您需要在应用启动时初始化商店,并传入您的产品ID列表。这一步是必须的,以便插件能够正确地与平台的支付系统进行交互。

void main() {
  // 初始化商店,传入产品ID列表
  StoreKit.instance.initialize([
    'subscription_id1',
    'subscription_id2',
    'subscription_id3',
  ]);
  
  runApp(const MyApp());
}

2. 添加监听器

2.1 添加Pro状态变化监听器

当用户的购买状态发生变化时(例如从非付费用户变为付费用户),您可以添加一个监听器来处理这些变化。这个监听器会在用户成功购买或恢复购买后触发。

void _onProStatusChanged(PurchasedItem item) {
  // 更新UI,检查用户是否已经购买了特定的产品
  setState(() {
    _isPremiumUser = StoreKit.instance.isProductPurchased('subscription_id1');
  });
}

// 添加监听器
StoreKit.instance.addProStatusChangedListener(_onProStatusChanged);
2.2 移除Pro状态变化监听器

当不再需要监听Pro状态变化时,可以移除该监听器以避免内存泄漏。

StoreKit.instance.removeProStatusChangedListener(_onProStatusChanged);
2.3 添加错误监听器

为了处理购买过程中可能出现的错误,您可以添加一个错误监听器。这个监听器会在购买失败时触发,并提供错误信息。

void _onError(PurchaseResult? error) {
  // 处理错误,显示提示信息
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text(error?.message ?? "error"),
    ),
  );
}

// 添加错误监听器
StoreKit.instance.addErrorListener(_onError);
2.4 移除错误监听器

当不再需要监听错误时,可以移除该监听器以避免内存泄漏。

StoreKit.instance.removeErrorListener(_onError);

3. 购买操作

3.1 恢复过去的购买

如果您希望用户能够恢复之前的购买记录(例如在卸载并重新安装应用后),可以调用 restorePastPurchases 方法。

await StoreKit.instance.restorePastPurchases(context);
3.2 购买订阅

要让用户购买订阅,您可以调用 purchaseSubscription 方法,并传入要购买的订阅项。

await StoreKit.instance.purchaseSubscription(subscriptionItem);
3.3 打开订阅管理页面

如果您想让用户管理他们的订阅(例如取消或更改订阅),可以调用 openSubscriptionManagementPage 方法。

await StoreKit.instance.openSubscriptionManagementPage();
3.4 检查产品是否已购买

要检查某个产品是否已经被用户购买,可以使用 isProductPurchased 方法。

bool purchased = StoreKit.instance.isProductPurchased('product_id');
3.5 获取已购买的产品ID列表

如果您想获取所有已购买的产品ID列表,可以使用 getPurchasedProductIds 方法。

List<String> purchasedIds = StoreKit.instance.getPurchasedProductIds();

4. 释放资源

当您不再需要使用 StoreKit 实例时,应该调用 dispose 方法来释放资源,避免内存泄漏。

StoreKit.instance.dispose();

完整示例Demo

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 FlutterStoreKit 插件来实现应用内购买功能。

import 'package:flutter/material.dart';
import 'package:flutter_store_kit/flutter_store_kit.dart';

void main() {
  // 初始化商店
  StoreKit.instance.initialize([
    'subscription_id1',
    'subscription_id2',
    'subscription_id3',
  ]);

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool _isPremiumUser = false;
  final List<IAPItem> _availableProducts = [];

  [@override](/user/override)
  void initState() {
    super.initState();

    // 添加Pro状态变化监听器
    StoreKit.instance.addProStatusChangedListener(_onProStatusChanged);

    // 添加错误监听器
    StoreKit.instance.addErrorListener(_onError);

    // 加载可用的产品
    _loadAvailableProducts();
  }

  void _loadAvailableProducts() async {
    // 获取所有可用的产品
    final products = await StoreKit.instance.getProducts([
      'subscription_id1',
      'subscription_id2',
      'subscription_id3',
    ]);

    if (products.isNotEmpty) {
      setState(() {
        _availableProducts.addAll(products);
      });
    }
  }

  void _onProStatusChanged(PurchasedItem item) {
    // 更新UI,检查用户是否已经购买了特定的产品
    setState(() {
      _isPremiumUser = StoreKit.instance.isProductPurchased('subscription_id1');
    });
  }

  void _onError(PurchaseResult? error) {
    // 处理错误,显示提示信息
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(error?.message ?? "error"),
      ),
    );
  }

  void _purchaseSubscription(IAPItem item) async {
    // 购买订阅
    await StoreKit.instance.purchaseSubscription(item);
  }

  [@override](/user/override)
  void dispose() {
    // 移除Pro状态变化监听器
    StoreKit.instance.removeProStatusChangedListener(_onProStatusChanged);

    // 移除错误监听器
    StoreKit.instance.removeErrorListener(_onError);

    // 释放资源
    StoreKit.instance.dispose();

    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('In-App Purchases'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              _isPremiumUser
                  ? 'You are a Premium User'
                  : 'You are not a Premium User',
              style: const TextStyle(fontSize: 24),
            ),
            const SizedBox(height: 20),
            _availableProducts.isEmpty
                ? const CircularProgressIndicator()
                : ListView.builder(
                    shrinkWrap: true,
                    itemCount: _availableProducts.length,
                    itemBuilder: (context, index) {
                      final product = _availableProducts[index];
                      return ListTile(
                        title: Text(product.title ?? 'No Title'),
                        subtitle: Text(product.description ?? 'No Description'),
                        trailing: _isPremiumUser
                            ? const Icon(Icons.check, color: Colors.green)
                            : ElevatedButton(
                                onPressed: () => _purchaseSubscription(product),
                                child: const Text('Buy'),
                              ),
                      );
                    },
                  ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter应用内购买插件flutter_store_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用内购买插件flutter_store_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter应用内购买插件flutter_store_kit的示例代码。这个示例将展示如何初始化插件、获取产品列表、进行购买以及处理购买结果。

首先,确保你已经在pubspec.yaml文件中添加了flutter_store_kit依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_store_kit: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,是主要的Flutter代码示例:

import 'package:flutter/material.dart';
import 'package:flutter_store_kit/flutter_store_kit.dart';

void main() {
  runApp(MyApp());
}

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

class _MyAppState extends State<MyApp> {
  FlutterStoreKit _storeKit = FlutterStoreKit();

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

  Future<void> _initializeStoreKit() async {
    // 配置产品信息
    List<SKProduct> products = await _storeKit.fetchProducts([
      'com.example.app.product1',
      'com.example.app.product2',
    ]);

    // 打印产品信息
    products.forEach((product) {
      print('Product ID: ${product.productId}');
      print('Product Localized Title: ${product.localizedTitle}');
      print('Product Localized Description: ${product.localizedDescription}');
      print('Product Price: ${product.price}');
    });

    // 设置购买监听器
    _storeKit.purchaseUpdatedStream.listen((purchase) {
      if (purchase.transactionState == SKPaymentTransactionState.purchased) {
        // 处理购买成功的情况
        print('Purchase successful for product: ${purchase.product.productId}');
        // 在这里验证购买并解锁内容
      } else if (purchase.transactionState == SKPaymentTransactionState.failed) {
        // 处理购买失败的情况
        print('Purchase failed for product: ${purchase.product.productId}');
      } else if (purchase.transactionState == SKPaymentTransactionState.restored) {
        // 处理恢复购买的情况
        print('Purchase restored for product: ${purchase.product.productId}');
      } else if (purchase.transactionState == SKPaymentTransactionState.deferred) {
        // 处理延迟支付的情况
        print('Purchase deferred for product: ${purchase.product.productId}');
      }

      // 完成交易
      _storeKit.finishTransaction(purchase);
    });
  }

  Future<void> _purchaseProduct(String productId) async {
    try {
      await _storeKit.purchaseProduct(productId);
    } catch (e) {
      print('Error purchasing product: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter In-App Purchase Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () => _purchaseProduct('com.example.app.product1'),
                child: Text('Purchase Product 1'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () => _purchaseProduct('com.example.app.product2'),
                child: Text('Purchase Product 2'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项:

  1. 产品IDfetchProductspurchaseProduct方法中的产品ID ('com.example.app.product1', 'com.example.app.product2') 需要与你在iTunes Connect或Google Play Console中配置的产品ID相匹配。

  2. 测试环境:在测试应用内购买时,确保你的设备已经登录了一个测试用的Apple ID或Google Play账号,并且该账号已经加入了相应的测试计划。

  3. 支付验证:在生产环境中,购买成功后你应该通过苹果的服务器或Google Play的API验证购买凭证,以确保购买的真实性和安全性。

  4. 错误处理:示例代码中只简单地打印了错误信息,实际应用中你应该有更完善的错误处理逻辑。

这个示例代码展示了如何使用flutter_store_kit插件进行应用内购买的基本流程,希望对你有所帮助。

回到顶部