【问题标题】:Flutter flutter_in_app_purchases subscription FlutterInAppPurchses.instance.getSubscriptions() is not retrieving any items for IAPItemFlutter flutter_in_app_purchases 订阅 FlutterInAppPurchses.instance.getSubscriptions() 没有为 IAPItem 检索任何项目
【发布时间】:2020-06-29 22:49:11
【问题描述】:

我正在尝试使用 flutter_in_app_purchases 插件在 Flutter 中实现可更新订阅。当我单击声明它的屏幕时,它会通过 initState() 函数,然后到达 initPlatformState() 并成功通过,但是当它到达 getProducts() 函数时,它返回一个空项目列表项的列表 = FlutterInappPurchase.instance.getSubscriptions([productID]);称呼。我已在 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());
    }
  }

【问题讨论】:

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


    【解决方案1】:

    这里有一个来自生产应用程序的工作示例。免责声明:我不再使用它,但我上次使用它时效果很好:

    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;
        });
      }
    

    【讨论】:

    • 它仍然导致同样的错误“PlatformException(consumeAllItems, refreshItem, No purchase found)”
    • 您确定在 AppStore 和 Play 商店中一切正常?
    • 你说得对,iOS 的捆绑标识符有问题。当我在我的手机上以调试模式运行它时我得到了它,并且出现了 iOS 弹出窗口并要求我连接 iTunes 但是当我登录并按购买时它只是说购买失败。你知道那是不是因为应用还没有发布吗?
    • 很可能,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多