Ani*_*lil 9 in-app-purchase flutter
我已经集成了 flutter in_app_purchase订阅(android),但它总是在 3 天后自动退款
我正在使用下面的代码进行颤振订阅。我在代码中找不到实际问题,请帮助我在这段代码中遗漏了什么
导入'dart:异步';
导入 'dart:io';
导入“包:flutter/material.dart”;
导入'包:url_launcher/url_launcher.dart';
导入'包:in_app_purchase / in_app_purchase.dart';
导入 'util/ConsumableStore.dart';
const bool _kAutoConsume = true;
const String _kConsumableId = '消耗品';
const List _kProductIds = ['订阅_项目', '购买_项目'];
类 StoreScreenNew 扩展 StatefulWidget {
@覆盖
_StoreScreenState createState() => _StoreScreenState();
}
类 _StoreScreenState 扩展状态 {
最终 InAppPurchaseConnection _connection = InAppPurchaseConnection.instance;
流订阅>_订阅;
列表_notFoundIds = [];
列表_产品=[];
列表_购买=[];
布尔_isAvailable = false;
布尔_purchasePending = false;
布尔_加载=真;
字符串_queryProductError;
布尔_isConnected = false;
String 商店名称 = "";
@覆盖
无效初始化状态(){
checkInternet().then((onValue) {
设置状态((){
_isConnected = onValue;
});
});
流购买更新 =
InAppPurchaseConnection.instance.purchaseUpdatedStream;
_subscription = buyUpdated.listen((purchaseDetailsList) {
_listenToPurchaseUpdated(购买详情列表);
}, onDone: () {
_订阅.取消();
}, onError: (错误) {
// 在这里处理错误。
});
initStoreInfo();
super.initState();
}
未来 checkInternet() 异步 {
尝试 {
最终结果=await InternetAddress.lookup('google.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
返回Future.value(true);
} 别的 {
返回Future.value(false);
}
} on SocketException catch (_) {
返回Future.value(false);
}
}
未来 initStoreInfo() 异步 {
如果(平台.isIOS){
商店名称 = "iTunes";
} 别的 {
商店名称 = "Play 商店";
}
最终 bool isAvailable = wait _connection.isAvailable();
如果(!可用){
设置状态((){
_isAvailable = isAvailable;
_产品= [];
_购买=[];
_notFoundIds = [];
_purchasePending = false;
_加载=假;
});
返回;
}
产品详细信息响应 产品详细信息响应 =
等待 _connection.queryProductDetails(_kProductIds.toSet());
if (productDetailResponse.error != null) {
设置状态((){
_queryProductError = ProductDetailResponse.error.message;
_isAvailable = isAvailable;
_products=productDetailResponse.productDetails;
_购买=[];
_notFoundIds = 产品详细信息响应.notFoundIDs;
_purchasePending = false;
_加载=假;
});
返回;
}
如果(productDetailResponse.productDetails.isEmpty){
设置状态((){
_queryProductError = null;
_isAvailable = isAvailable;
_products=productDetailResponse.productDetails;
_购买=[];
_notFoundIds = 产品详细信息响应.notFoundIDs;
_purchasePending = false;
_加载=假;
});
返回;
}
最终 QueryPurchaseDetailsResponse 购买响应 =
等待 _connection.queryPastPurchases();
if (purchaseResponse.error!= null) {
// 处理查询过去的购买错误..
}
最终列表verifiedPurchases = [];
for (PurchaseDetails buy in buyResponse.pastPurchases) {
如果(等待_verifyPurchase(购买)){
verifyPurchases.add(购买);
}
}
设置状态((){
_isAvailable = isAvailable;
_products=productDetailResponse.productDetails;
_purchases = 已验证的购买;
_notFoundIds = 产品详细信息响应.notFoundIDs;
_purchasePending = false;
_加载=假;
});
}
@覆盖
无效处置(){
_订阅.取消();
超级.dispose();
}
@覆盖
小部件构建(BuildContext上下文){
列表栈=[];
如果(_queryProductError == null){
堆栈.添加(
列表显示(
孩子们: [
_buildConnectionCheckTile(),
_buildProductList(),
添加隐私(),
添加链接()
],
),
);
} 别的 {
堆栈.添加(中心(
孩子:文本(_queryProductError),
));
}
如果(_purchasePending){
堆栈.添加(
堆(
孩子们: [
不透明度(
不透明度:0.3,
子: const ModalBarrier(可关闭: false,颜色: Colors.grey),
),
中心(
子:CircularProgressIndicator(),
),
],
),
);
}
返回MaterialApp(
主页: 脚手架(
应用栏:应用栏(
背景颜色:Theme.of(context).primaryColor,
自动暗示领先:真,
标题:文本('PRO',
样式:Theme.of(context).textTheme.headline5),
前导:图标按钮(
图标:图标(Icons.arrow_back),
onPressed: () => Navigator.pop(context, false),
)),
主体:_isConnected
?堆(
孩子们:堆栈,
)
: 中心(
子项:列(
mainAxisAlignment:MainAxisAlignment.center,
crossAxisAlignment:CrossAxisAlignment.center,
孩子们: [
大小框(
高度:10,
),
容器(
边距:EdgeInsets.all(20),
孩子:文本(
“检查您的互联网连接,然后重试。”,
文本对齐:文本对齐.center,
样式:TextStyle(颜色:Colors.black45,字体大小:26),
))
])),
),
);
}
卡_buildConnectionCheckTile() {
如果(_加载){
return Card(child: ListTile(title: const Text('尝试连接...')));
}
最终小部件 storeHeader = ListTile(
前导: Icon(_isAvailable ? Icons.check : Icons.block,
颜色:_有货吗?Colors.green : ThemeData.light().errorColor),
标题:文字(
'商店是 ' + (_isAvailable ? '可用' : '不可用') + '.'),
);
最终列表子项 = [
!_可用吗?商店标题:容器()
];
如果(!_isAvailable){
儿童.addAll([
除法器(),
列表图块(
title: Text('未连接',
样式: TextStyle(颜色: ThemeData.light().errorColor)),
副标题:const Text(
“无法连接到支付处理器。该应用程序配置正确吗?有关说明,请参阅示例自述文件。'),
),
]);
}
返回卡(子项:列(子项:子项));
}
卡_buildProductList() {
如果(_加载){
退卡(
孩子:(ListTile(
领先:CircularProgressIndicator(),
title: Text('正在获取产品...'))));
}
如果(!_isAvailable){
返回卡();
}
最终 ListTile 产品标题 = ListTile(
标题:文字(
'可用选项',
样式:TextStyle(字体大小:20),
),
);
列出产品列表 = [];
如果(_notFoundIds.isNotEmpty){
产品列表.add(ListTile(
title: Text('[${_notFoundIds.join(", ")}] 未找到',
样式: TextStyle(颜色: ThemeData.light().errorColor)),
字幕:文本(
'这个应用程序需要特殊配置才能运行。请参阅 example/README.md 了解说明。')));
}
地图购买 =
Map.fromEntries(_purchases.map((PurchaseDetails 购买) {
如果(购买.pendingCompletePurchase){
InAppPurchaseConnection.instance.completePurchase(购买);
}
return MapEntry(purchase.productID,purchase);
}));
产品列表.addAll(_产品.map(
(产品详细信息产品详细信息){
购买详情 previousPurchase = 购买[productDetails.id];
返回容器(
装饰:BoxDecoration(
borderRadius: BorderRadius.circular(10),
颜色: 颜色.白色,
盒子阴影:[
BoxShadow(颜色: Colors.grey, spreadRadius: 1),
],
),
边距:EdgeInsets.all(5),
填充:EdgeInsets.all(10),
子项:列(
孩子们: [
文本(
产品详细信息.标题,
文本对齐:文本对齐.center,
样式:文本样式(
字体大小:14,
fontWeight:FontWeight.bold,
颜色:
先前购买!= null ?颜色.绿色 : 颜色.黑色),
),
大小框(
高度:10,
),
除法器(),
大小框(
高度:10,
),
文本(
产品详细信息.描述,
文本对齐:文本对齐.左,
),
大小框(
高度:20,
),
除法器(),
容器(
对齐:Alignment.bottomRight,
孩子:以前的购买!= null
?容器(
填充:const EdgeInsets.all(10.0),
装饰: new BoxDecoration(
形状:BoxShape.圆形,
颜色: 颜色.绿色,
),
孩子:图标(
图标.检查,
尺寸:30,
颜色: 颜色.白色,
))
: 扁平按钮(
孩子:文本(
产品详情.价格,
样式:TextStyle(字体大小:18),
),
颜色:颜色.绿色[800],
文本颜色:颜色.白色,
按下时:() {
购买参数 购买参数 = 购买参数(
产品详细信息: 产品详细信息,
应用程序用户名:空,
沙箱测试:假);
if (productDetails.id == _kConsumableId) {
_connection.buyConsumable(
购买参数: 购买参数,
自动消费:_kAutoConsume || 平台.isIOS);
} 别的 {
_connection.buyNonConsumable(
购买参数:购买参数);
}
},
))
],
),
);
},
));
退卡(
边距:EdgeInsets.all(10),
海拔:0,
子项:列(
孩子们: [
产品标题,
除法器(),
] +
产品列表,
));
}
无效 showPendingUI() {
设置状态((){
_purchasePending = true;
});
}
void DeliverProduct(PurchaseDetails buyDetails) async {
if (purchaseDetails.productID == _kConsumableId) {
等待 ConsumableStore.save(purchaseDetails.purchaseID);
App.setPurchasesStatus(true);
设置状态((){
_purchasePending = false;
});
} 别的 {
设置状态((){
_purchases.add(购买详情);
_purchasePending = false;
});
}
}
无效handleError(IAPError错误){
设置状态((){
_purchasePending = false;
});
}
未来 _verifyPurchase(PurchaseDetails 购买详情) {
返回Future.value(true);
}
void _handleInvalidPurchase(PurchaseDetails 购买详细信息) {
}
void _listenToPurchaseUpdated(列出购买详情列表) {
buyDetailsList.forEach((PurchaseDetails buyDetails) async {
if (purchaseDetails.status == PurchaseStatus.pending) {
showPendingUI();
} 别的 {
if (purchaseDetails.status == PurchaseStatus.error) {
处理错误(purchaseDetails.error);
} else if (purchaseDetails.status == PurchaseStatus.purchased) {
bool valid = wait _verifyPurchase(purchaseDetails);
如果(有效){
交付产品(购买详情);
} 别的 {
_handleInvalidPurchase(购买详情);
返回;
}
}
如果(平台.isAndroid){
if (!_kAutoConsume && buyDetails.productID == _kConsumableId) {
等待 InAppPurchaseConnection.instance
.consumePurchase(购买详情);
}
}
如果(purchaseDetails.pendingCompletePurchase){
等待 InAppPurchaseConnection.instance
.completePurchase(购买详情);
}
}
});
}
}
确保您正在调用断点
InAppPurchaseConnection.instance.completePurchase(purchase);
Run Code Online (Sandbox Code Playgroud)
也许在调用之前发生了一些事情。
也许在两者之间调用了 dispose() 。
| 归档时间: |
|
| 查看次数: |
3416 次 |
| 最近记录: |