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

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

好的,以下是Flutter应用内购买插件flutter_rustore_billing的完整示例demo:

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

import 'package:flutter_rustore_billing/flutter_rustore_billing.dart';
import 'package:flutter_rustore_billing/pigeons/rustore.dart';
import 'package:flutter_rustore_billing_ex/PurchaseWidget.dart';
import 'package:flutter_rustore_billing_ex/ProductWidget.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  // define your tab controller here
  late TabController _tabController;

  List<String> availableProductIds = [
    "product1",
    "product2",
    "product3"
  ];
  String consoleApplicationId = "184050";
  String applicationId = "ru.rustore.sdk.billingexample";
  String releaseKeystore = "path/to/your/keystore.keystore";
  String releaseProperties = "path/to/your/release.properties";

  List<Product?> products = [];
  List<Purchase?> purchases = [];
  PaymentResult? payment;
  ConfirmPurchaseResponse? confirmPurchaseResponse;
  Purchase? purchaseInformation;

  [@override](/user/override)
  void initState() {
    // initialise your tab controller here
    _tabController = TabController(length: 2, vsync: this);
    super.initState();
    billing();
    // RustoreBillingClient.offNativeErrorHandling();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> billing() async {
    RustoreBillingClient.initialize(consoleApplicationId, "example", true).then((value) {
      print("initialize success: $value");
      RustoreBillingClient.available().then((value) {
        print("available $value");
      }, onError: (err) {
        print("available err: $err");
      });
    }, onError: (err) {
      print("initialize err: $err");
      RustoreBillingClient.available().then((value) {
        print("available $value");
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          leading: const Icon(Icons.menu, color: Colors.black),
          backgroundColor: Colors.transparent,
          elevation: 0,
          title: const Text(
            'Flutter RuStore Billing',
            style: TextStyle(color: Colors.black),
          ),
        ),
        body: Column(
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: FutureBuilder<bool>(
                future: RustoreBillingClient.isRustoreInstalled(),
                builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
                  if (snapshot.connectionState == ConnectionState.waiting) {
                    return const CircularProgressIndicator(); // Show loading indicator while waiting
                  } else if (snapshot.hasError) {
                    return Text('Error: ${snapshot.error}'); // Show error message if one occurs
                  } else {
                    bool isInstalled = snapshot.data ?? false;
                    return Text('Is RuStore installed: $isInstalled'); // Use the result
                  }
                },
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 11, horizontal: 5),
              child: TabBar(
                controller: _tabController,
                labelColor: Colors.green,
                isScrollable: true,
                indicatorColor: Colors.transparent,
                unselectedLabelColor: Colors.grey,
                unselectedLabelStyle: const TextStyle(
                  fontSize: 16,
                  color: Colors.grey,
                  fontWeight: FontWeight.w700,
                ),
                labelStyle: const TextStyle(
                  fontSize: 16,
                  fontWeight: FontWeight.w700,
                ),
                tabs: const [
                  Text('PRODUCTS'),
                  Text('PURCHASEPurchases'),
                ],
              ),
            ),
            Expanded(
              child: TabBarView(
                controller: _tabController,
                children: const [
                  ProductWidget(),
                  PurchaseWidget(),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用flutter_rustore_billing插件实现应用内购买的示例代码。这个插件通常用于处理Google Play Store和App Store中的应用内购买。请注意,实际应用中你需要处理更多的错误处理和状态管理,这里只是提供一个基础示例。

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

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

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

初始化购买插件

在你的Flutter应用的入口文件(通常是main.dart)中,初始化flutter_rustore_billing插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: InAppPurchaseScreen(),
    );
  }
}

class InAppPurchaseScreen extends StatefulWidget {
  @override
  _InAppPurchaseScreenState createState() => _InAppPurchaseScreenState();
}

class _InAppPurchaseScreenState extends State<InAppPurchaseScreen> {
  late FlutterRustoreBilling _billing;

  @override
  void initState() {
    super.initState();
    _billing = FlutterRustoreBilling.instance;
    _initBilling();
  }

  Future<void> _initBilling() async {
    try {
      await _billing.initBilling();
      print("Billing initialized");
      // 获取产品详情
      await _fetchProducts();
    } catch (e) {
      print("Failed to initialize billing: $e");
    }
  }

  Future<void> _fetchProducts() async {
    try {
      List<ProductDetails> products = await _billing.getProductDetails(["product_id_1", "product_id_2"]);
      // 在这里处理获取到的产品详情
      print("Products: $products");
    } catch (e) {
      print("Failed to fetch products: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('In-App Purchases'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 这里添加购买逻辑
            _purchaseProduct("product_id_1");
          },
          child: Text('Purchase Product'),
        ),
      ),
    );
  }

  Future<void> _purchaseProduct(String productId) async {
    try {
      PurchaseParam purchaseParam = PurchaseParam(
        productDetails: await _billing.getProductDetails([productId]).then((value) => value.first),
        applicationUserName: "user_id_or_null", // 可以为null
      );

      PurchaseResult result = await _billing.buyConsumable(purchaseParam);
      if (result.responseCode == BillingResponse.OK) {
        print("Purchase successful: ${result.purchaseDetails}");
        // 处理购买成功的情况
      } else {
        print("Purchase failed: ${result.debugMessage}");
      }
    } catch (e) {
      print("Purchase error: $e");
    }
  }
}

注意事项

  1. 产品ID:在调用getProductDetailsbuyConsumable时,你需要使用实际的产品ID,这些ID需要在Google Play Console或App Store Connect中配置。

  2. 权限和配置:确保你的应用已经在Google Play Console或App Store Connect中配置了应用内购买,并且你的应用具有相应的权限。

  3. 处理购买结果:在实际应用中,你需要处理购买成功、失败、恢复购买等多种情况,并根据业务需求更新UI或服务器状态。

  4. 测试环境:在测试应用内购买时,请确保使用测试账号,并配置测试产品。

  5. 安全性:确保你的购买逻辑是安全的,避免被恶意用户绕过。

这个示例只是一个简单的入门示例,实际应用中你可能需要处理更多的细节和边缘情况。希望这个示例能帮到你!

回到顶部