flutter - Flutter flutter_in_app_purchases订阅FlutterInAppPurchses.instance.getSubscriptions()没有检索IAPItem的任何项目

标签 flutter dart in-app-purchase in-app-subscription

我正在尝试使用flutter_in_app_purchases插件在flutter中实现可再生订阅。当我单击声明它的屏幕时,它会通过initState()函数,然后到达initPlatformState()并成功通过该过程,但是当它到达getProducts()函数时,它将返回一个空项目列表项的列表= FlutterInappPurchase.instance.getSubscriptions([productID]); call 。我已经在App Store Connect和Google Play Store中添加了按月订阅,并填写了税表。任何帮助,将不胜感激。

List<IAPItem> _items = [];
  static const String productID = 'monthly_subscription';

  @override
  void initState() {
    super.initState();
    print("IN INIT STATE");
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    print("In init platform state");
    // prepare
    final bool available = await InAppPurchaseConnection.instance.isAvailable();
    print(available);
    var close = await FlutterInappPurchase.instance.endConnection;
    var result = await FlutterInappPurchase.instance.initConnection;
    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) {
      print('In not mounded');
      return;
    }

    // refresh items for android
    /*try {
      String msg = await FlutterInappPurchase.instance.consumeAllItems;
      print('consumeAllItems: $msg');
    } catch(e){
      print(e.toString());
    }*/

    await _getProduct();
  }

  Future<Null> _getProduct() async {
    print("In get products");
    try {
      List<IAPItem> items = await FlutterInappPurchase.instance.getSubscriptions([productID]);
      print("Items is: $items");
      for (var item in items) {
        print('${item.toString()}');
        this._items.add(item);
      }

      setState(() {
        this._items = items;
      });
    } catch(e) {
      print(e.toString());
    }
  }

最佳答案

在这里,您有一个生产中应用程序的工作示例。免责声明:我不再使用它了,但是我上次做得很好:

class _InAppState extends State<InApp> {
  StreamSubscription _purchaseUpdatedSubscription;
  StreamSubscription _purchaseErrorSubscription;
  StreamSubscription _conectionSubscription;
  final List<String> _productLists = Platform.isAndroid
      ? [
    'subs_premium', 'subs_user'
  ]
      : ['subs_premium', 'subs_boss', 'subscripcion_user'];


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

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

  @override
  void dispose() {
    super.dispose();
    if (_conectionSubscription != null) {
      _conectionSubscription.cancel();
      _conectionSubscription = null;
    }
  }

  // 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 FlutterInappPurchase.instance.platformVersion;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // prepare
    var result = await FlutterInappPurchase.instance.initConnection;
    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;
    });

    // refresh items for android
    try {
      String msg = await FlutterInappPurchase.instance.consumeAllItems;
      print('consumeAllItems: $msg');
    } catch (err) {
      print('consumeAllItems error: $err');
    }

    _conectionSubscription = FlutterInappPurchase.connectionUpdated.listen((connected) {
      print('connected: $connected');
    });

    _purchaseUpdatedSubscription = FlutterInappPurchase.purchaseUpdated.listen((productItem) {
      print('purchase-updated: $productItem');
    });

    _purchaseErrorSubscription = FlutterInappPurchase.purchaseError.listen((purchaseError) {
      print('purchase-error: $purchaseError');
    });
    final List<String> _SKUS = widget.premium ? ['subs_boss']
        : ['subs_user'] ;
    _getSubscriptions(_SKUS);
  }

  void _requestPurchase(IAPItem item) {
    FlutterInappPurchase.instance.requestPurchase(item.productId);
  }

  Future _getProduct() async {
    print('TEST 1 HERE ${_productLists.length}, ${_productLists.first.toString()}');
    List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(_productLists);
    print('TEST 2 HERE ${items.length}');
    for (var item in items) {
      print('${item.toString()}');
      this._items.add(item);
    }

    setState(() {
      this._items = items;
      this._purchases = [];
    });
  }

  Future _getPurchases() async {
    List<PurchasedItem> items =
    await FlutterInappPurchase.instance.getAvailablePurchases();
    for (var item in items) {
      print('${item.toString()}');
      this._purchases.add(item);
    }

    setState(() {
      this._items = [];
      this._purchases = items;
    });
  }

  Future _getSubscriptions(_SKUS) async {
    List<IAPItem> items =
    await FlutterInappPurchase.instance.getSubscriptions(_SKUS);
    for (var item in items) {
      print('${item.toString()}');
      this._subscripions.add(item);
    }

    setState(() {
      this._items = [];
      this._subscripions = items;
    });
  }

  Future _getPurchaseHistory() async {
    List<PurchasedItem> items = await FlutterInappPurchase.instance.getPurchaseHistory();
    for (var item in items) {
      print('${item.toString()}');
      this._purchases.add(item);
    }

    setState(() {
      this._items = [];
      this._purchases = items;
    });
  }

关于flutter - Flutter flutter_in_app_purchases订阅FlutterInAppPurchses.instance.getSubscriptions()没有检索IAPItem的任何项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60746381/

相关文章:

flutter - 如何在Sembast记录中的映射内监听单个值?

Flutter 下拉菜单无法通过提供程序更改文本

iphone - SFProductsRequest 总是返回零

安卓 : in-app Billing problem- getting the order Id from the response

dart - 单击父选项卡后,我想创建动态子选项卡和子 TabBarViews

dart - 卡重叠凸起的按钮在 flutter

flutter - 如何在展开的ListView中设置容器宽度

typescript - 来自 TypeScript 的匿名类型对象的 Dart 等价物

android - 应用内结算错误

flutter - 异常 : ideviceinfo returned an error: ERROR: Could not connect to lockdownd, 错误代码 -17