Flutter flutter_in_app_purchases подписка FlutterInAppPurchses.instance.getSubscriptions () не получает никаких элементов для IAPItem

Я пытаюсь реализовать возобновляемую подписку во флаттере с помощью плагина flutter_in_app_purchases. Когда я нажимаю на экран, на котором это объявлено, он проходит через функцию 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());
    }
  }

person Salwa Badreddine    schedule 18.03.2020    source источник


Ответы (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;
    });
  }
person i6x86    schedule 18.03.2020
comment
Это по-прежнему вызывает ту же ошибку PlatformException (takeAllItems, refreshItem, покупок не найдено) - person Salwa Badreddine; 19.03.2020
comment
А вы уверены, что у вас все в порядке в AppStore и play store? - person i6x86; 19.03.2020
comment
Вы правы, что-то не так с идентификатором пакета для iOS. У меня он заработал, когда я запускаю его на своем телефоне в режиме отладки, и появляется всплывающее окно iOS с просьбой подключиться к iTunes, но когда я вхожу в систему и нажимаю «Купить», он просто говорит, что покупка не удалась. Вы знаете, это потому, что приложение еще не выпущено? - person Salwa Badreddine; 19.03.2020
comment
скорее всего, да. - person i6x86; 19.03.2020