Flutter 当在颤振中运行初始逻辑时,in_app_购买不可用

Flutter 当在颤振中运行初始逻辑时,in_app_购买不可用,flutter,in-app-purchase,Flutter,In App Purchase,现在我正在使用集成与我的应用程序。这是我的依赖项,使用: in_app_purchase: 1.0.0 我遵循示例的文档。当运行到页面并初始化商店信息时,我面临一个问题。这是我现在使用的完整代码: import 'dart:async'; import 'package:cruise/src/models/pay/pay_model.dart'; import 'package:fish_redux/fish_redux.dart'; import 'package:in_app_purch

现在我正在使用集成与我的应用程序。这是我的依赖项,使用:

in_app_purchase: 1.0.0
我遵循示例的文档。当运行到页面并初始化商店信息时,我面临一个问题。这是我现在使用的完整代码:

import 'dart:async';

import 'package:cruise/src/models/pay/pay_model.dart';
import 'package:fish_redux/fish_redux.dart';
import 'package:in_app_purchase/in_app_purchase.dart';

import 'action.dart';
import 'state.dart';

Effect<PayState> buildEffect() {
  return combineEffects(<Object, Effect<PayState>>{
    Lifecycle.initState: _onInit,
  });
}

const bool _kAutoConsume = true;

const String _kConsumableId = 'consumable';
const String _kUpgradeId = 'upgrade';
const String _kSilverSubscriptionId = 'subscription_silver';
const String _kGoldSubscriptionId = 'subscription_gold';

final InAppPurchase _inAppPurchase = InAppPurchase.instance;
late StreamSubscription<List<PurchaseDetails>> _subscription;
String? _queryProductError;
const List<String> _kProductIds = <String>[
  _kConsumableId,
  _kUpgradeId,
  _kSilverSubscriptionId,
  _kGoldSubscriptionId,
];

Future _onInit(Action action, Context<PayState> ctx) async {
  // https://pub.dev/packages/in_app_purchase
  // https://joebirch.co/flutter/adding-in-app-purchases-to-flutter-apps/
  final Stream<List<PurchaseDetails>> purchaseUpdated =
      _inAppPurchase.purchaseStream;

  _subscription = purchaseUpdated.listen((purchaseDetailsList) {
    _listenToPurchaseUpdated(purchaseDetailsList);
  }, onDone: () {
    _subscription.cancel();
  }, onError: (error) {
    // handle error here.
  });

  initStoreInfo(ctx);
}

void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList) {
  purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
    if (purchaseDetails.status == PurchaseStatus.pending) {
      //_showPendingUI();
    } else {
      if (purchaseDetails.status == PurchaseStatus.error) {
        //_handleError(purchaseDetails.error!);
      } else if (purchaseDetails.status == PurchaseStatus.purchased ||
          purchaseDetails.status == PurchaseStatus.restored) {}
      if (purchaseDetails.pendingCompletePurchase) {
        await InAppPurchase.instance.completePurchase(purchaseDetails);
      }
    }
  });
}

Future<void> initStoreInfo(Context<PayState> ctx) async {
  final bool isAvailable = await _inAppPurchase.isAvailable();
  if (!isAvailable) {
    PayModel payModel = PayModel(
        isAvailable: isAvailable,
        products: [],
        purchases: [],
        notFoundIds: [],
        purchasePending: false,
        loading: false);
    ctx.dispatch(PayActionCreator.onUpdate(payModel));
    return;
  }

  ProductDetailsResponse productDetailResponse = await _inAppPurchase.queryProductDetails(_kProductIds.toSet());
  if (productDetailResponse.error != null) {
    /*setState(() {
      _queryProductError = productDetailResponse.error!.message;
      _isAvailable = isAvailable;
      _products = productDetailResponse.productDetails;
      _purchases = [];
      _notFoundIds = productDetailResponse.notFoundIDs;
      _consumables = [];
      _purchasePending = false;
      _loading = false;
    });*/
    return;
  }

  if (productDetailResponse.productDetails.isEmpty) {
    /*setState(() {
      _queryProductError = null;
      _isAvailable = isAvailable;
      _products = productDetailResponse.productDetails;
      _purchases = [];
      _notFoundIds = productDetailResponse.notFoundIDs;
      _consumables = [];
      _purchasePending = false;
      _loading = false;
    });*/
    return;
  }

  await _inAppPurchase.restorePurchases();

  /*List<String> consumables = await ConsumableStore.load();
  setState(() {
    _isAvailable = isAvailable;
    _products = productDetailResponse.productDetails;
    _notFoundIds = productDetailResponse.notFoundIDs;
    _consumables = consumables;
    _purchasePending = false;
    _loading = false;
  });*/
}
导入'dart:async';
导入“包:cruise/src/models/pay/pay_model.dart”;
进口“包装:fish_redux/fish_redux.dart”;
导入“包:应用程序内购买/应用程序内购买.dart”;
导入“action.dart”;
导入“state.dart”;
效果buildEffect(){
返回组合效应({
Lifecycle.initState:\u onInit,
});
}
const bool_kAutoConsume=true;
常量字符串kConsumableId='consumableid';
常量字符串_kUpgradeId='升级';
常量字符串_kSilverSubscriptionId='subscription_silver';
常量字符串_kGoldSubscriptionId='subscription_gold';
最终InAppPurchase _InAppPurchase=InAppPurchase.instance;
逾期认购(即逾期认购);;
绳子_查询产品错误;
常量列表\u kProductId=[
_kConsumableId,
_库普格拉迪德,
_kSilverSubscriptionId,
_kGoldSubscriptionId,
];
Future _onInit(操作、上下文ctx)异步{
// https://pub.dev/packages/in_app_purchase
// https://joebirch.co/flutter/adding-in-app-purchases-to-flutter-apps/
最终流购买更新=
_inAppPurchase.purchaseStream;
_订阅=purchaseUpdated.listen((purchaseDetailsList){
_ListentPurchaseUpdated(purchaseDetailsList);
},onDone:(){
_订阅。取消();
},onError:(错误){
//在这里处理错误。
});
initStoreInfo(ctx);
}
void _listenToPurchaseUpdated(列表purchaseDetailsList){
forEach((PurchaseDetails PurchaseDetails)异步{
if(purchaseDetails.status==PurchaseStatus.pending){
//_showPendingUI();
}否则{
if(purchaseDetails.status==PurchaseStatus.error){
//_handleError(purchaseDetails.error!);
}else if(purchaseDetails.status==PurchaseStatus.purchased||
purchaseDetails.status==PurchaseStatus.restored){}
if(purchaseDetails.pendingCompletePurchase){
等待apppurchase.instance.completePurchase(purchaseDetails);
}
}
});
}
未来initStoreInfo(上下文ctx)异步{
final bool isAvailable=wait_inAppPurchase.isAvailable();
如果(!i可用){
PayModel PayModel=PayModel(
可利用的;可利用的,
产品:[],
采购:[],
NotFoundId:[],
purchasePending:false,
加载:假);
ctx.dispatch(PayActionCreator.onUpdate(payModel));
返回;
}
ProductDetailsResponse productDetailResponse=wait _inAppPurchase.queryProductDetails(_kProductId.toSet());
if(productDetailResponse.error!=null){
/*设置状态(){
_queryProductError=productDetailResponse.error!。消息;
_i可用=i可用;
_products=productDetailResponse.productDetails;
_采购=[];
_NotFoundId=productDetailResponse.NotFoundId;
_消耗品=[];
_purchasePending=false;
_加载=假;
});*/
返回;
}
if(productDetailResponse.productDetails.isEmpty){
/*设置状态(){
_queryProductError=null;
_i可用=i可用;
_products=productDetailResponse.productDetails;
_采购=[];
_NotFoundId=productDetailResponse.NotFoundId;
_消耗品=[];
_purchasePending=false;
_加载=假;
});*/
返回;
}
等待购买。恢复购买();
/*列出耗材=等待ConsumableStore.load();
设置状态(){
_i可用=i可用;
_products=productDetailResponse.productDetails;
_NotFoundId=productDetailResponse.NotFoundId;
_消耗品=消耗品;
_purchasePending=false;
_加载=假;
});*/
}
让我感到困惑的是,当运行此代码时,
\u inAppPurchase.isAvailable()
,会显示该代码不可用(返回false)。为什么不适用的采购不可用?什么情况可能导致此问题?我该怎么做才能使它可用?这是一个项目背景,可能有助于理解我所面临的问题

我已经做到了:

  • 在apple connect中添加订阅产品
  • 添加一个沙盒用户
  • XCode中的附加应用程序购买功能
任何地方都可以看到日志为什么inAppPurchase不可用?这是我的购买配置: