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中的附加应用程序购买功能