提交 d6302c91 authored 作者: 王鹏飞's avatar 王鹏飞

feat: migrate from flutter_inapp_purchase to official in_app_purchase plugin

Replace deprecated flutter_inapp_purchase (StoreKit 1 only) with the official in_app_purchase plugin supporting StoreKit 2 on iOS 15+. Update all IAP-related controllers (recharge, order awaiting/cancel/completed) to use InAppPurchase.instance, purchaseStream, and buyConsumable API.
上级 70946588
......@@ -7,8 +7,6 @@ PODS:
- Flutter (1.0.0)
- flutter_app_update (0.0.1):
- Flutter
- flutter_inapp_purchase (0.0.1):
- Flutter
- flutter_inappwebview_ios (0.0.1):
- Flutter
- flutter_inappwebview_ios/Core (= 0.0.1)
......@@ -30,6 +28,9 @@ PODS:
- WechatOpenSDK-XCFramework (~> 2.0.4)
- image_picker_ios (0.0.1):
- Flutter
- in_app_purchase_storekit (0.0.1):
- Flutter
- FlutterMacOS
- just_audio (0.0.1):
- Flutter
- FlutterMacOS
......@@ -57,12 +58,12 @@ DEPENDENCIES:
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- Flutter (from `Flutter`)
- flutter_app_update (from `.symlinks/plugins/flutter_app_update/ios`)
- flutter_inapp_purchase (from `.symlinks/plugins/flutter_inapp_purchase/ios`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- flutter_sound (from `.symlinks/plugins/flutter_sound/ios`)
- flutter_tts (from `.symlinks/plugins/flutter_tts/ios`)
- fluwx (from `.symlinks/plugins/fluwx/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
......@@ -86,8 +87,6 @@ EXTERNAL SOURCES:
:path: Flutter
flutter_app_update:
:path: ".symlinks/plugins/flutter_app_update/ios"
flutter_inapp_purchase:
:path: ".symlinks/plugins/flutter_inapp_purchase/ios"
flutter_inappwebview_ios:
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
flutter_sound:
......@@ -98,6 +97,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/fluwx/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
in_app_purchase_storekit:
:path: ".symlinks/plugins/in_app_purchase_storekit/darwin"
just_audio:
:path: ".symlinks/plugins/just_audio/darwin"
package_info_plus:
......@@ -116,13 +117,13 @@ SPEC CHECKSUMS:
connectivity_plus: 481668c94744c30c53b8895afb39159d1e619bdf
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9
flutter_inapp_purchase: 722da12971a50f306f37e62fc1aaf576b1cbecf6
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
flutter_sound: d95194f6476c9ad211d22b3a414d852c12c7ca44
flutter_sound_core: 7f2626d249d3a57bfa6da892ef7e22d234482c1a
flutter_tts: b88dbc8655d3dc961bc4a796e4e16a4cc1795833
fluwx: 49b4472b54762abde51daa0bc348ba05520016ac
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
in_app_purchase_storekit: 22cca7d08eebca9babdf4d07d0baccb73325d3c8
just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: 566e1b7a2f3900e4b0020914ad3fc051dcc95596
......
......@@ -5,14 +5,10 @@ class CoinRechargeController extends GetxController {
// 上线文
final BuildContext context;
CoinRechargeController({required this.context});
dynamic _purchaseUpdatedSubscription;
dynamic _purchaseErrorSubscription;
dynamic _connectionSubscription;
PurchasedItem? _resultItem;
StreamSubscription<List<PurchaseDetails>>? _purchaseUpdatedSubscription;
PurchaseDetails? _resultItem;
List<IAPItem> _items = [];
//未完成的订单
final List<PurchasedItem> _pendingPurchases = [];
List<ProductDetails> _items = [];
// 支付宝
Tobias tobias = Tobias();
// 微信
......@@ -30,13 +26,16 @@ class CoinRechargeController extends GetxController {
// 充值模型
late CoinModel rechargeModel = CoinModel();
// 支付方式
late PayModel _payModel = pays.first;
late PayModel _payModel = pays.isNotEmpty
? pays.first
: PayModel(type: 0, name: '', icon: '', selected: false);
PayModel get payModel => _payModel;
bool iapProductLoading = false;
bool isSubmitting = false;
@override
void onInit() {
initPlatformState();
_getPendingPurchase();
super.onInit();
}
......@@ -48,18 +47,10 @@ class CoinRechargeController extends GetxController {
}
@override
void onClose() {
if (_connectionSubscription != null) {
_connectionSubscription.cancel();
_connectionSubscription = null;
}
if (_purchaseUpdatedSubscription != null) {
_purchaseUpdatedSubscription.cancel();
_purchaseUpdatedSubscription!.cancel();
_purchaseUpdatedSubscription = null;
}
if (_purchaseErrorSubscription != null) {
_purchaseErrorSubscription.cancel();
_purchaseErrorSubscription = null;
}
super.onClose();
}
......@@ -98,54 +89,85 @@ class CoinRechargeController extends GetxController {
}
final result = await MineAPI.coinsRechargeList(type: type);
data = result;
if (data.isNotEmpty && rechargeModel.identifying == null) {
choose(data.first);
}
if(Platform.isIOS){
_getProduct();
await _getProduct();
}
update();
}
/// 初始化支付
Future<void> initPlatformState() async{
await FlutterInappPurchase.instance.initialize();
_connectionSubscription = FlutterInappPurchase.connectionUpdated.listen((connected) {
});
_purchaseUpdatedSubscription = FlutterInappPurchase.purchaseUpdated.listen((productItem) {
CustomToast.dismiss();
if(productItem != null){
_resultItem = productItem;
_requestOrderStatus();
}
});
_purchaseErrorSubscription = FlutterInappPurchase.purchaseError.listen((purchaseError) {
final available = await InAppPurchase.instance.isAvailable();
_iapLog('IAP store available: $available');
_purchaseUpdatedSubscription =
InAppPurchase.instance.purchaseStream.listen(
_listenToPurchaseUpdated,
onError: (error) {
CustomToast.dismiss();
Toast.show(purchaseError!.message.toString());
});
_iapLog('IAP purchase stream error: $error');
Toast.show('内购发生错误,请稍后重试');
},
);
}
/// 获取商品列表
Future _getProduct() async {
iapProductLoading = true;
update();
List<String> productList = data
.where((coinModel) => coinModel.identifying != null)
.map((coinModel) => coinModel.identifying!)
.toList();
List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(productList);
for (var item in items) {
_items.add(item);
_iapLog('IAP productList: $productList');
try {
final response =
await InAppPurchase.instance.queryProductDetails(productList.toSet());
_items = response.productDetails;
_iapLog('IAP query error: ${response.error}');
_iapLog('IAP not found ids: ${response.notFoundIDs}');
_iapLog('IAP loaded items: ${_items.map((item) => item.id).toList()}');
} catch (error) {
_items = [];
_iapLog('IAP getProducts failed: $error');
} finally {
iapProductLoading = false;
update();
}
_items = items;
// update();
}
/// 创建订单
void createRechargeOrder() async {
if (isSubmitting) return;
if (rechargeModel.identifying == null || rechargeModel.identifying!.isEmpty) {
Toast.show('请选择充值金额');
return;
}
ProductDetails? targetItem;
if (Platform.isIOS) {
if (iapProductLoading) {
Toast.show('内购商品加载中,请稍后重试');
return;
}
targetItem = _findIapItem(rechargeModel.identifying!);
if (targetItem == null) {
await _getProduct();
targetItem = _findIapItem(rechargeModel.identifying!);
}
if (targetItem == null) {
_iapLog('IAP target not found: ${rechargeModel.identifying}, loaded: ${_items.map((item) => item.id).toList()}');
Toast.show('内购商品加载失败,请稍后重试');
return;
}
}
isSubmitting = true;
update();
String type = '';
if(Platform.isIOS){
type = '3';
......@@ -153,7 +175,18 @@ class CoinRechargeController extends GetxController {
else{
type = payModel.type.toString();
}
final result = await MineAPI.createRechargeOrder(identifying: rechargeModel.identifying??'', type: type);
late PayOrderModel result;
try {
result = await MineAPI.createRechargeOrder(
identifying: rechargeModel.identifying ?? '', type: type);
} catch (error) {
isSubmitting = false;
update();
Console.log('createRechargeOrder failed: $error');
return;
}
isSubmitting = false;
update();
Console.log('-----------------------------------${result.ordersnum}--------------------------------${result.msg}');
payOrderModel = result;
......@@ -163,10 +196,7 @@ class CoinRechargeController extends GetxController {
// 苹果
if(Platform.isIOS){
// 发起苹果支付
IAPItem targetItem = _items.firstWhere(
(item) => item.productId == rechargeModel.identifying,
);
_requestPurchase(targetItem);
_requestPurchase(targetItem!);
}
// 安卓
else if(Platform.isAndroid){
......@@ -184,9 +214,23 @@ class CoinRechargeController extends GetxController {
}
ProductDetails? _findIapItem(String productId) {
for (final item in _items) {
if (item.id == productId) {
return item;
}
}
return null;
}
void _iapLog(String message) {
Console.log(message);
debugPrint(message);
}
/// 获取后台关于当前单号的结算结果
void _requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'',receipt:_resultItem != null?_resultItem!.transactionReceipt.toString():'');
Future<void> _requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'',receipt:_resultItem != null?_resultItem!.verificationData.serverVerificationData.toString():'');
// 查询订单支付成功
if (result.paySuccess == 1){
......@@ -208,7 +252,6 @@ class CoinRechargeController extends GetxController {
}
StorageService.to.setObject(kFailOrder, temp);
}
FlutterInappPurchase.instance.finishTransactionIOS(_resultItem!.transactionId!);
}
}
// 查询订单支付失败
......@@ -218,8 +261,8 @@ class CoinRechargeController extends GetxController {
// 保存未支付的订单
Map<String,String> failOrder = {
'orderNum':payOrderModel.ordersnum??'',
'transactionReceipt':_resultItem!.transactionReceipt.toString(),
'transactionId':_resultItem!.transactionId.toString()
'transactionReceipt':_resultItem!.verificationData.serverVerificationData.toString(),
'transactionId':_resultItem!.purchaseID.toString()
};
List<Map> failOrderList = [];
failOrderList.add(failOrder);
......@@ -232,10 +275,19 @@ class CoinRechargeController extends GetxController {
}
/// 苹果支付
void _requestPurchase(IAPItem item) {
void _requestPurchase(ProductDetails item) {
CustomToast.loading();
FlutterInappPurchase.instance
.requestPurchase(item.productId!);
try {
final purchaseParam = PurchaseParam(productDetails: item);
InAppPurchase.instance.buyConsumable(
purchaseParam: purchaseParam,
autoConsume: true,
);
} catch (error) {
CustomToast.dismiss();
_iapLog('IAP request purchase failed: $error');
Toast.show('内购发起失败,请稍后重试');
}
}
/// 支付宝支付
......@@ -271,20 +323,26 @@ class CoinRechargeController extends GetxController {
});
}
///获取未完成的购买
Future _getPendingPurchase() async {
List<PurchasedItem>? items = await FlutterInappPurchase.instance.getPurchaseHistory();
for (var item in items!) {
_pendingPurchases.add(item);
}
if(StorageService.to.getObject(kFailOrder) !=null){
List<Map<String,String>> failOrderList = StorageService.to.getObject(kFailOrder) as List<Map<String, String>>;
for (var item in _pendingPurchases) {
for (var element in failOrderList) {
if(element['transactionId'] == item.transactionId){
_requestOrderStatus();
}
Future<void> _listenToPurchaseUpdated(
List<PurchaseDetails> purchaseDetailsList) async {
for (final purchaseDetails in purchaseDetailsList) {
_iapLog(
'IAP purchase update: ${purchaseDetails.productID}, ${purchaseDetails.status}, ${purchaseDetails.error}');
if (purchaseDetails.status == PurchaseStatus.pending) {
continue;
}
CustomToast.dismiss();
if (purchaseDetails.status == PurchaseStatus.error) {
Toast.show(purchaseDetails.error?.message ?? '内购发生错误,请稍后重试');
} else if (purchaseDetails.status == PurchaseStatus.canceled) {
Toast.show('支付已取消');
} else if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
_resultItem = purchaseDetails;
await _requestOrderStatus();
}
if (purchaseDetails.pendingCompletePurchase) {
await InAppPurchase.instance.completePurchase(purchaseDetails);
}
}
}
......
......@@ -7,7 +7,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_book/apis/index.dart';
import 'package:flutter_book/models/index.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
......
......@@ -56,8 +56,11 @@ class _CoinRechargePageState extends State<CoinRechargePage>
Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
child: CustomGradientButton(
text: '立即充值${controller.rechargeModel.priceName ?? ''}',
isEnabled: true,
text: controller.isSubmitting
? '正在充值...'
: '立即充值${controller.rechargeModel.priceName ?? ''}',
isEnabled: controller.rechargeModel.identifying != null &&
!controller.isSubmitting,
onPressed: () {
controller.createRechargeOrder();
},
......
......@@ -20,14 +20,10 @@ class UserOrderCoinAwaitingController extends GetxController {
// 微信
Fluwx fluwx = Fluwx();
late PayOrderModel payOrderModel;
dynamic _purchaseUpdatedSubscription;
dynamic _purchaseErrorSubscription;
dynamic _connectionSubscription;
PurchasedItem? _resultItem;
StreamSubscription<List<PurchaseDetails>>? _purchaseUpdatedSubscription;
PurchaseDetails? _resultItem;
List<IAPItem> _items = [];
///未完成的订单
final List<PurchasedItem> _pendingPurchases = [];
List<ProductDetails> _items = [];
// 紫荆币数据
List<CoinModel> data = [];
......@@ -37,7 +33,6 @@ class UserOrderCoinAwaitingController extends GetxController {
if(Platform.isIOS){
_getProduct();
initPlatformState();
_getPendingPurchase();
}
super.onInit();
}
......@@ -50,42 +45,27 @@ class UserOrderCoinAwaitingController extends GetxController {
@override
void onClose() {
// controller.onRefresh();
if (_connectionSubscription != null) {
_connectionSubscription.cancel();
_connectionSubscription = null;
}
if (_purchaseUpdatedSubscription != null) {
_purchaseUpdatedSubscription.cancel();
_purchaseUpdatedSubscription!.cancel();
_purchaseUpdatedSubscription = null;
}
if (_purchaseErrorSubscription != null) {
_purchaseErrorSubscription.cancel();
_purchaseErrorSubscription = null;
}
super.onClose();
}
/// 初始化
Future<void> initPlatformState() async{
await FlutterInappPurchase.instance.initialize();
_connectionSubscription = FlutterInappPurchase.connectionUpdated.listen((connected) {
});
_purchaseUpdatedSubscription = FlutterInappPurchase.purchaseUpdated.listen((productItem) {
final available = await InAppPurchase.instance.isAvailable();
_iapLog('IAP store available: $available');
_purchaseUpdatedSubscription =
InAppPurchase.instance.purchaseStream.listen(
_listenToPurchaseUpdated,
onError: (error) {
CustomToast.dismiss();
if(productItem != null){
_resultItem = productItem;
requestOrderStatus();
}
});
_purchaseErrorSubscription = FlutterInappPurchase.purchaseError.listen((purchaseError) {
CustomToast.dismiss();
Toast.show(purchaseError!.message.toString());
});
_iapLog('IAP purchase stream error: $error');
Toast.show('内购发生错误,请稍后重试');
},
);
}
......@@ -130,14 +110,20 @@ class UserOrderCoinAwaitingController extends GetxController {
.map((coinModel) => coinModel.identifying!)
.toList();
List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(productList);
for (var item in items) {
_items.add(item);
}
if (productList.isEmpty) return;
_items = items;
// update();
_iapLog('IAP productList: $productList');
try {
final response =
await InAppPurchase.instance.queryProductDetails(productList.toSet());
_items = response.productDetails;
_iapLog('IAP query error: ${response.error}');
_iapLog('IAP not found ids: ${response.notFoundIDs}');
_iapLog('IAP loaded items: ${_items.map((item) => item.id).toList()}');
} catch (error) {
_items = [];
_iapLog('IAP getProducts failed: $error');
}
}
/// 支付订单
......@@ -145,8 +131,8 @@ class UserOrderCoinAwaitingController extends GetxController {
// 苹果支付
if (model.payType ==3){
// 发起苹果支付
IAPItem targetItem = _items.firstWhere(
(item) => item.productId == model.goodsId,
ProductDetails targetItem = _items.firstWhere(
(item) => item.id == model.goodsId,
);
_requestPurchase(targetItem);
}
......@@ -178,10 +164,19 @@ class UserOrderCoinAwaitingController extends GetxController {
}
/// 苹果支付
void _requestPurchase(IAPItem item) {
void _requestPurchase(ProductDetails item) {
CustomToast.loading();
FlutterInappPurchase.instance
.requestPurchase(item.productId!);
try {
final purchaseParam = PurchaseParam(productDetails: item);
InAppPurchase.instance.buyConsumable(
purchaseParam: purchaseParam,
autoConsume: true,
);
} catch (error) {
CustomToast.dismiss();
_iapLog('IAP request purchase failed: $error');
Toast.show('内购发起失败,请稍后重试');
}
}
/// 支付宝支付
......@@ -220,7 +215,7 @@ class UserOrderCoinAwaitingController extends GetxController {
/// 获取订单状态
void requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.transactionReceipt.toString():'');
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.verificationData.serverVerificationData.toString():'');
if (result.paySuccess == 1){
Toast.show('订单支付完成');
if(context.mounted){
......@@ -239,7 +234,6 @@ class UserOrderCoinAwaitingController extends GetxController {
}
StorageService.to.setObject(kFailOrder, temp);
}
FlutterInappPurchase.instance.finishTransactionIOS(_resultItem!.transactionId!);
}
}
else{
......@@ -248,8 +242,8 @@ class UserOrderCoinAwaitingController extends GetxController {
// 保存未支付的订单
Map<String,String> failOrder = {
'orderNum':payOrderModel.ordersnum??'',
'transactionReceipt':_resultItem!.transactionReceipt.toString(),
'transactionId':_resultItem!.transactionId.toString()
'transactionReceipt':_resultItem!.verificationData.serverVerificationData.toString(),
'transactionId':_resultItem!.purchaseID.toString()
};
List<Map> failOrderList = [];
failOrderList.add(failOrder);
......@@ -259,23 +253,33 @@ class UserOrderCoinAwaitingController extends GetxController {
}
///获取未完成的购买
Future _getPendingPurchase() async {
List<PurchasedItem>? items = await FlutterInappPurchase.instance.getPurchaseHistory();
for (var item in items!) {
_pendingPurchases.add(item);
void _iapLog(String message) {
Console.log(message);
debugPrint(message);
}
if(StorageService.to.getObject(kFailOrder) !=null){
List<Map<String,String>> failOrderList = StorageService.to.getObject(kFailOrder) as List<Map<String, String>>;
for (var item in _pendingPurchases) {
for (var element in failOrderList) {
if(element['transactionId'] == item.transactionId){
requestOrderStatus();
Future<void> _listenToPurchaseUpdated(
List<PurchaseDetails> purchaseDetailsList) async {
for (final purchaseDetails in purchaseDetailsList) {
_iapLog(
'IAP purchase update: ${purchaseDetails.productID}, ${purchaseDetails.status}, ${purchaseDetails.error}');
if (purchaseDetails.status == PurchaseStatus.pending) {
continue;
}
CustomToast.dismiss();
if (purchaseDetails.status == PurchaseStatus.error) {
Toast.show(purchaseDetails.error?.message ?? '内购发生错误,请稍后重试');
} else if (purchaseDetails.status == PurchaseStatus.canceled) {
Toast.show('支付已取消');
} else if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
_resultItem = purchaseDetails;
requestOrderStatus();
}
if (purchaseDetails.pendingCompletePurchase) {
await InAppPurchase.instance.completePurchase(purchaseDetails);
}
}
}
}
library user_order_coin_awaiting;
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
......
......@@ -20,14 +20,10 @@ class UserOrderCoinCancelController extends GetxController {
// 微信
Fluwx fluwx = Fluwx();
late PayOrderModel payOrderModel;
dynamic _purchaseUpdatedSubscription;
dynamic _purchaseErrorSubscription;
dynamic _connectionSubscription;
PurchasedItem? _resultItem;
StreamSubscription<List<PurchaseDetails>>? _purchaseUpdatedSubscription;
PurchaseDetails? _resultItem;
List<IAPItem> _items = [];
///未完成的订单
final List<PurchasedItem> _pendingPurchases = [];
List<ProductDetails> _items = [];
List<CoinModel> data = [];
......@@ -37,7 +33,6 @@ class UserOrderCoinCancelController extends GetxController {
if(Platform.isIOS){
_getProduct();
initPlatformState();
_getPendingPurchase();
}
super.onInit();
}
......@@ -50,43 +45,27 @@ class UserOrderCoinCancelController extends GetxController {
@override
void onClose() {
// controller.onRefresh();
if (_connectionSubscription != null) {
_connectionSubscription.cancel();
_connectionSubscription = null;
}
if (_purchaseUpdatedSubscription != null) {
_purchaseUpdatedSubscription.cancel();
_purchaseUpdatedSubscription!.cancel();
_purchaseUpdatedSubscription = null;
}
if (_purchaseErrorSubscription != null) {
_purchaseErrorSubscription.cancel();
_purchaseErrorSubscription = null;
}
super.onClose();
}
/// 初始化
Future<void> initPlatformState() async{
await FlutterInappPurchase.instance.initialize();
_connectionSubscription = FlutterInappPurchase.connectionUpdated.listen((connected) {
});
_purchaseUpdatedSubscription = FlutterInappPurchase.purchaseUpdated.listen((productItem) {
CustomToast.dismiss();
if(productItem != null){
_resultItem = productItem;
requestOrderStatus();
}
});
_purchaseErrorSubscription = FlutterInappPurchase.purchaseError.listen((purchaseError) {
final available = await InAppPurchase.instance.isAvailable();
_iapLog('IAP store available: $available');
_purchaseUpdatedSubscription =
InAppPurchase.instance.purchaseStream.listen(
_listenToPurchaseUpdated,
onError: (error) {
CustomToast.dismiss();
Toast.show(purchaseError!.message.toString());
});
_iapLog('IAP purchase stream error: $error');
Toast.show('内购发生错误,请稍后重试');
},
);
}
......@@ -131,13 +110,20 @@ class UserOrderCoinCancelController extends GetxController {
.map((coinModel) => coinModel.identifying!)
.toList();
List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(productList);
for (var item in items) {
_items.add(item);
}
if (productList.isEmpty) return;
_items = items;
// update();
_iapLog('IAP productList: $productList');
try {
final response =
await InAppPurchase.instance.queryProductDetails(productList.toSet());
_items = response.productDetails;
_iapLog('IAP query error: ${response.error}');
_iapLog('IAP not found ids: ${response.notFoundIDs}');
_iapLog('IAP loaded items: ${_items.map((item) => item.id).toList()}');
} catch (error) {
_items = [];
_iapLog('IAP getProducts failed: $error');
}
}
/// 支付订单
......@@ -145,8 +131,8 @@ class UserOrderCoinCancelController extends GetxController {
// 苹果支付
if (model.payType ==3){
// 发起苹果支付
IAPItem targetItem = _items.firstWhere(
(item) => item.productId == model.goodsId,
ProductDetails targetItem = _items.firstWhere(
(item) => item.id == model.goodsId,
);
_requestPurchase(targetItem);
}
......@@ -178,10 +164,19 @@ class UserOrderCoinCancelController extends GetxController {
}
/// 苹果支付
void _requestPurchase(IAPItem item) {
void _requestPurchase(ProductDetails item) {
CustomToast.loading();
FlutterInappPurchase.instance
.requestPurchase(item.productId!);
try {
final purchaseParam = PurchaseParam(productDetails: item);
InAppPurchase.instance.buyConsumable(
purchaseParam: purchaseParam,
autoConsume: true,
);
} catch (error) {
CustomToast.dismiss();
_iapLog('IAP request purchase failed: $error');
Toast.show('内购发起失败,请稍后重试');
}
}
/// 支付宝支付
......@@ -220,7 +215,7 @@ class UserOrderCoinCancelController extends GetxController {
/// 获取订单状态
void requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.transactionReceipt.toString():'');
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.verificationData.serverVerificationData.toString():'');
if (result.paySuccess == 1){
Toast.show('订单支付完成');
if(context.mounted){
......@@ -239,7 +234,6 @@ class UserOrderCoinCancelController extends GetxController {
}
StorageService.to.setObject(kFailOrder, temp);
}
FlutterInappPurchase.instance.finishTransactionIOS(_resultItem!.transactionId!);
}
}
else{
......@@ -248,8 +242,8 @@ class UserOrderCoinCancelController extends GetxController {
// 保存未支付的订单
Map<String,String> failOrder = {
'orderNum':payOrderModel.ordersnum??'',
'transactionReceipt':_resultItem!.transactionReceipt.toString(),
'transactionId':_resultItem!.transactionId.toString()
'transactionReceipt':_resultItem!.verificationData.serverVerificationData.toString(),
'transactionId':_resultItem!.purchaseID.toString()
};
List<Map> failOrderList = [];
failOrderList.add(failOrder);
......@@ -259,25 +253,33 @@ class UserOrderCoinCancelController extends GetxController {
}
///获取未完成的购买
Future _getPendingPurchase() async {
List<PurchasedItem>? items = await FlutterInappPurchase.instance.getPurchaseHistory();
for (var item in items!) {
_pendingPurchases.add(item);
void _iapLog(String message) {
Console.log(message);
debugPrint(message);
}
if(StorageService.to.getObject(kFailOrder) !=null){
List<Map<String,String>> failOrderList = StorageService.to.getObject(kFailOrder) as List<Map<String, String>>;
for (var item in _pendingPurchases) {
for (var element in failOrderList) {
if(element['transactionId'] == item.transactionId){
requestOrderStatus();
Future<void> _listenToPurchaseUpdated(
List<PurchaseDetails> purchaseDetailsList) async {
for (final purchaseDetails in purchaseDetailsList) {
_iapLog(
'IAP purchase update: ${purchaseDetails.productID}, ${purchaseDetails.status}, ${purchaseDetails.error}');
if (purchaseDetails.status == PurchaseStatus.pending) {
continue;
}
CustomToast.dismiss();
if (purchaseDetails.status == PurchaseStatus.error) {
Toast.show(purchaseDetails.error?.message ?? '内购发生错误,请稍后重试');
} else if (purchaseDetails.status == PurchaseStatus.canceled) {
Toast.show('支付已取消');
} else if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
_resultItem = purchaseDetails;
requestOrderStatus();
}
if (purchaseDetails.pendingCompletePurchase) {
await InAppPurchase.instance.completePurchase(purchaseDetails);
}
}
}
}
library user_order_coin_cancel;
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
......
......@@ -20,13 +20,9 @@ class UserOrderCoinCompletedController extends GetxController {
// 微信
Fluwx fluwx = Fluwx();
late PayOrderModel payOrderModel;
dynamic _purchaseUpdatedSubscription;
dynamic _purchaseErrorSubscription;
dynamic _connectionSubscription;
PurchasedItem? _resultItem;
List<IAPItem> _items = [];
///未完成的订单
final List<PurchasedItem> _pendingPurchases = [];
StreamSubscription<List<PurchaseDetails>>? _purchaseUpdatedSubscription;
PurchaseDetails? _resultItem;
List<ProductDetails> _items = [];
List<CoinModel> data = [];
......@@ -36,7 +32,6 @@ class UserOrderCoinCompletedController extends GetxController {
if(Platform.isIOS){
_getProduct();
initPlatformState();
_getPendingPurchase();
}
super.onInit();
}
......@@ -49,43 +44,27 @@ class UserOrderCoinCompletedController extends GetxController {
@override
void onClose() {
// controller.onRefresh();
if (_connectionSubscription != null) {
_connectionSubscription.cancel();
_connectionSubscription = null;
}
if (_purchaseUpdatedSubscription != null) {
_purchaseUpdatedSubscription.cancel();
_purchaseUpdatedSubscription!.cancel();
_purchaseUpdatedSubscription = null;
}
if (_purchaseErrorSubscription != null) {
_purchaseErrorSubscription.cancel();
_purchaseErrorSubscription = null;
}
super.onClose();
}
/// 初始化
Future<void> initPlatformState() async{
await FlutterInappPurchase.instance.initialize();
_connectionSubscription = FlutterInappPurchase.connectionUpdated.listen((connected) {
});
_purchaseUpdatedSubscription = FlutterInappPurchase.purchaseUpdated.listen((productItem) {
CustomToast.dismiss();
if(productItem != null){
_resultItem = productItem;
requestOrderStatus();
}
});
_purchaseErrorSubscription = FlutterInappPurchase.purchaseError.listen((purchaseError) {
final available = await InAppPurchase.instance.isAvailable();
_iapLog('IAP store available: $available');
_purchaseUpdatedSubscription =
InAppPurchase.instance.purchaseStream.listen(
_listenToPurchaseUpdated,
onError: (error) {
CustomToast.dismiss();
Toast.show(purchaseError!.message.toString());
});
_iapLog('IAP purchase stream error: $error');
Toast.show('内购发生错误,请稍后重试');
},
);
}
......@@ -131,13 +110,20 @@ class UserOrderCoinCompletedController extends GetxController {
.map((coinModel) => coinModel.identifying!)
.toList();
List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(productList);
for (var item in items) {
_items.add(item);
}
if (productList.isEmpty) return;
_items = items;
// update();
_iapLog('IAP productList: $productList');
try {
final response =
await InAppPurchase.instance.queryProductDetails(productList.toSet());
_items = response.productDetails;
_iapLog('IAP query error: ${response.error}');
_iapLog('IAP not found ids: ${response.notFoundIDs}');
_iapLog('IAP loaded items: ${_items.map((item) => item.id).toList()}');
} catch (error) {
_items = [];
_iapLog('IAP getProducts failed: $error');
}
}
/// 支付订单
......@@ -145,8 +131,8 @@ class UserOrderCoinCompletedController extends GetxController {
// 苹果支付
if (model.payType ==3){
// 发起苹果支付
IAPItem targetItem = _items.firstWhere(
(item) => item.productId == model.goodsId,
ProductDetails targetItem = _items.firstWhere(
(item) => item.id == model.goodsId,
);
_requestPurchase(targetItem);
}
......@@ -178,10 +164,19 @@ class UserOrderCoinCompletedController extends GetxController {
}
/// 苹果支付
void _requestPurchase(IAPItem item) {
void _requestPurchase(ProductDetails item) {
CustomToast.loading();
FlutterInappPurchase.instance
.requestPurchase(item.productId!);
try {
final purchaseParam = PurchaseParam(productDetails: item);
InAppPurchase.instance.buyConsumable(
purchaseParam: purchaseParam,
autoConsume: true,
);
} catch (error) {
CustomToast.dismiss();
_iapLog('IAP request purchase failed: $error');
Toast.show('内购发起失败,请稍后重试');
}
}
/// 支付宝支付
......@@ -220,7 +215,7 @@ class UserOrderCoinCompletedController extends GetxController {
/// 获取订单状态
void requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.transactionReceipt.toString():'');
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.verificationData.serverVerificationData.toString():'');
if (result.paySuccess == 1){
Toast.show('订单支付完成');
if(context.mounted){
......@@ -239,7 +234,6 @@ class UserOrderCoinCompletedController extends GetxController {
}
StorageService.to.setObject(kFailOrder, temp);
}
FlutterInappPurchase.instance.finishTransactionIOS(_resultItem!.transactionId!);
}
}
else{
......@@ -248,8 +242,8 @@ class UserOrderCoinCompletedController extends GetxController {
// 保存未支付的订单
Map<String,String> failOrder = {
'orderNum':payOrderModel.ordersnum??'',
'transactionReceipt':_resultItem!.transactionReceipt.toString(),
'transactionId':_resultItem!.transactionId.toString()
'transactionReceipt':_resultItem!.verificationData.serverVerificationData.toString(),
'transactionId':_resultItem!.purchaseID.toString()
};
List<Map> failOrderList = [];
failOrderList.add(failOrder);
......@@ -259,25 +253,33 @@ class UserOrderCoinCompletedController extends GetxController {
}
///获取未完成的购买
Future _getPendingPurchase() async {
List<PurchasedItem>? items = await FlutterInappPurchase.instance.getPurchaseHistory();
for (var item in items!) {
_pendingPurchases.add(item);
void _iapLog(String message) {
Console.log(message);
debugPrint(message);
}
if(StorageService.to.getObject(kFailOrder) !=null){
List<Map<String,String>> failOrderList = StorageService.to.getObject(kFailOrder) as List<Map<String, String>>;
for (var item in _pendingPurchases) {
for (var element in failOrderList) {
if(element['transactionId'] == item.transactionId){
requestOrderStatus();
Future<void> _listenToPurchaseUpdated(
List<PurchaseDetails> purchaseDetailsList) async {
for (final purchaseDetails in purchaseDetailsList) {
_iapLog(
'IAP purchase update: ${purchaseDetails.productID}, ${purchaseDetails.status}, ${purchaseDetails.error}');
if (purchaseDetails.status == PurchaseStatus.pending) {
continue;
}
CustomToast.dismiss();
if (purchaseDetails.status == PurchaseStatus.error) {
Toast.show(purchaseDetails.error?.message ?? '内购发生错误,请稍后重试');
} else if (purchaseDetails.status == PurchaseStatus.canceled) {
Toast.show('支付已取消');
} else if (purchaseDetails.status == PurchaseStatus.purchased ||
purchaseDetails.status == PurchaseStatus.restored) {
_resultItem = purchaseDetails;
requestOrderStatus();
}
if (purchaseDetails.pendingCompletePurchase) {
await InAppPurchase.instance.completePurchase(purchaseDetails);
}
}
}
}
library user_order_coin_completed;
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
......
......@@ -6,7 +6,7 @@ packages:
description:
name: archive
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.6.1"
args:
......@@ -14,7 +14,7 @@ packages:
description:
name: args
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.7.0"
asn1lib:
......@@ -22,7 +22,7 @@ packages:
description:
name: asn1lib
sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.6.5"
async:
......@@ -30,7 +30,7 @@ packages:
description:
name: async
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.13.1"
audio_session:
......@@ -38,7 +38,7 @@ packages:
description:
name: audio_session
sha256: "2b7fff16a552486d078bfc09a8cde19f426dc6d6329262b684182597bec5b1ac"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.1.25"
badges:
......@@ -46,7 +46,7 @@ packages:
description:
name: badges
sha256: cf1c88fb3777df69ccd630b80de5267f54efa4a39381b0404a7c03d56cb7c041
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
boolean_selector:
......@@ -54,7 +54,7 @@ packages:
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
carousel_slider:
......@@ -62,7 +62,7 @@ packages:
description:
name: carousel_slider
sha256: febf4b0163e0242adc13d7a863b04965351f59e7dfea56675c7c2caa7bcd7476
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.1.2"
characters:
......@@ -70,7 +70,7 @@ packages:
description:
name: characters
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
clock:
......@@ -78,23 +78,23 @@ packages:
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
code_assets:
dependency: transitive
description:
name: code_assets
sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687"
url: "https://pub.flutter-io.cn"
sha256: dad6bf6b9f4f378b0a69edbf42584d336efd1a9ce15deb1ba591cbb1b5ff440f
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.19.1"
connectivity_plus:
......@@ -102,7 +102,7 @@ packages:
description:
name: connectivity_plus
sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.0.2"
connectivity_plus_platform_interface:
......@@ -110,7 +110,7 @@ packages:
description:
name: connectivity_plus_platform_interface
sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.4"
convert:
......@@ -118,7 +118,7 @@ packages:
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
cross_file:
......@@ -126,7 +126,7 @@ packages:
description:
name: cross_file
sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.3.5+2"
crypto:
......@@ -134,7 +134,7 @@ packages:
description:
name: crypto
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.7"
cupertino_icons:
......@@ -142,23 +142,23 @@ packages:
description:
name: cupertino_icons
sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.9"
dbus:
dependency: transitive
description:
name: dbus
sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
url: "https://pub.flutter-io.cn"
sha256: "792974a4007974fbc5c1b5433eb2330a9db3e368c3f906253af4c007d0f49a91"
url: "https://pub.dev"
source: hosted
version: "0.7.12"
version: "0.7.13"
decimal:
dependency: "direct main"
description:
name: decimal
sha256: "24a261d5d5c87e86c7651c417a5dbdf8bcd7080dd592533910e8d0505a279f21"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
dio:
......@@ -166,7 +166,7 @@ packages:
description:
name: dio
sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.9.2"
dio_web_adapter:
......@@ -174,7 +174,7 @@ packages:
description:
name: dio_web_adapter
sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
easy_refresh:
......@@ -182,7 +182,7 @@ packages:
description:
name: easy_refresh
sha256: "73eb6119f7275270cedc764fa22e724b62a2f110265945699c9bc3290681ee70"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.5.0"
encrypt:
......@@ -190,7 +190,7 @@ packages:
description:
name: encrypt
sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.0.3"
extended_image:
......@@ -198,7 +198,7 @@ packages:
description:
name: extended_image
sha256: "69d4299043334ecece679996e47d0b0891cd8c29d8da0034868443506f1d9a78"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "8.3.1"
extended_image_library:
......@@ -206,7 +206,7 @@ packages:
description:
name: extended_image_library
sha256: e61dafd94400fff6ef7ed1523d445ff3af137f198f3228e4a3107bc5b4bec5d1
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.0.6"
fake_async:
......@@ -214,7 +214,7 @@ packages:
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
ffi:
......@@ -222,7 +222,7 @@ packages:
description:
name: ffi
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
file:
......@@ -230,7 +230,7 @@ packages:
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "7.0.1"
file_selector_linux:
......@@ -238,7 +238,7 @@ packages:
description:
name: file_selector_linux
sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.4"
file_selector_macos:
......@@ -246,7 +246,7 @@ packages:
description:
name: file_selector_macos
sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.5"
file_selector_platform_interface:
......@@ -254,7 +254,7 @@ packages:
description:
name: file_selector_platform_interface
sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.7.0"
file_selector_windows:
......@@ -262,7 +262,7 @@ packages:
description:
name: file_selector_windows
sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.3+5"
fixnum:
......@@ -270,7 +270,7 @@ packages:
description:
name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
flutter:
......@@ -283,7 +283,7 @@ packages:
description:
name: flutter_app_update
sha256: cb373a9d011c7c7d7e3d027e71d3fa3c4049d41e4be7364124bd93a95fe311a7
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.2.3"
flutter_cache_manager:
......@@ -291,7 +291,7 @@ packages:
description:
name: flutter_cache_manager
sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.4.1"
flutter_easyloading:
......@@ -299,23 +299,15 @@ packages:
description:
name: flutter_easyloading
sha256: ba21a3c883544e582f9cc455a4a0907556714e1e9cf0eababfcb600da191d17c
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
flutter_inapp_purchase:
dependency: "direct main"
description:
name: flutter_inapp_purchase
sha256: "748757271506a3cc7745aa501019c7ce8051d8738b8a36aee12a617d8e9df8d3"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.6.2"
flutter_inappwebview:
dependency: "direct main"
description:
name: flutter_inappwebview
sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "6.1.5"
flutter_inappwebview_android:
......@@ -323,7 +315,7 @@ packages:
description:
name: flutter_inappwebview_android
sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.3"
flutter_inappwebview_internal_annotations:
......@@ -331,7 +323,7 @@ packages:
description:
name: flutter_inappwebview_internal_annotations
sha256: e30fba942e3debea7b7e6cdd4f0f59ce89dd403a9865193e3221293b6d1544c6
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
flutter_inappwebview_ios:
......@@ -339,7 +331,7 @@ packages:
description:
name: flutter_inappwebview_ios
sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_inappwebview_macos:
......@@ -347,7 +339,7 @@ packages:
description:
name: flutter_inappwebview_macos
sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_inappwebview_platform_interface:
......@@ -355,7 +347,7 @@ packages:
description:
name: flutter_inappwebview_platform_interface
sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.0+1"
flutter_inappwebview_web:
......@@ -363,7 +355,7 @@ packages:
description:
name: flutter_inappwebview_web
sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_inappwebview_windows:
......@@ -371,7 +363,7 @@ packages:
description:
name: flutter_inappwebview_windows
sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
flutter_lints:
......@@ -379,7 +371,7 @@ packages:
description:
name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_localizations:
......@@ -392,7 +384,7 @@ packages:
description:
name: flutter_oss_aliyun
sha256: "8280c1e8dfb792dec6449d1e6052e1d3492b3b3a1dfee456cc41d3f31b4cbc26"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "6.4.2"
flutter_plugin_android_lifecycle:
......@@ -400,7 +392,7 @@ packages:
description:
name: flutter_plugin_android_lifecycle
sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.0.34"
flutter_screenutil:
......@@ -408,7 +400,7 @@ packages:
description:
name: flutter_screenutil
sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.9.3"
flutter_slidable:
......@@ -416,7 +408,7 @@ packages:
description:
name: flutter_slidable
sha256: a857de7ea701f276fd6a6c4c67ae885b60729a3449e42766bb0e655171042801
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
flutter_sound:
......@@ -424,7 +416,7 @@ packages:
description:
name: flutter_sound
sha256: "77f0252a2f08449d621f68b8fd617c3b391e7f862eaa94bb32f53cc2dc3bbe85"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "9.30.0"
flutter_sound_platform_interface:
......@@ -432,7 +424,7 @@ packages:
description:
name: flutter_sound_platform_interface
sha256: "5ffc858fd96c6fa277e3bb25eecc100849d75a8792b1f9674d1ba817aea9f861"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "9.30.0"
flutter_sound_web:
......@@ -440,7 +432,7 @@ packages:
description:
name: flutter_sound_web
sha256: "3af46f45f44768c01c83ba260855c956d0963673664947926d942aa6fbf6f6fb"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "9.30.0"
flutter_spinkit:
......@@ -448,7 +440,7 @@ packages:
description:
name: flutter_spinkit
sha256: "77850df57c00dc218bfe96071d576a8babec24cf58b2ed121c83cca4a2fdce7f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.2.2"
flutter_star:
......@@ -456,7 +448,7 @@ packages:
description:
name: flutter_star
sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
flutter_test:
......@@ -469,7 +461,7 @@ packages:
description:
name: flutter_tts
sha256: cbb3fd43b946e62398560235469e6113e4fe26c40eab1b7cb5e7c417503fb3a8
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.8.5"
flutter_web_plugins:
......@@ -482,7 +474,7 @@ packages:
description:
name: fluwx
sha256: d25c26a12a1fa280833105869ea255a5877695e03dc1190f0d2c027a7c989ef3
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.6.3"
get:
......@@ -490,39 +482,31 @@ packages:
description:
name: get
sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.7.3"
glob:
dependency: transitive
description:
name: glob
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.3"
go_router:
dependency: "direct main"
description:
name: go_router
sha256: e1a30a66d734f9e498b1b6522d6a75ded28242bad2359a9158df38a1c30bcf1f
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "10.2.0"
hooks:
dependency: transitive
description:
name: hooks
sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e"
url: "https://pub.flutter-io.cn"
sha256: a41af4e8fc687cd6d33de9751eb936c8c0204ebe2bcb6c15ecf707504bf47f31
url: "https://pub.dev"
source: hosted
version: "1.0.3"
version: "2.0.0"
http:
dependency: transitive
description:
name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.6.0"
http_client_helper:
......@@ -530,7 +514,7 @@ packages:
description:
name: http_client_helper
sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
http_parser:
......@@ -538,7 +522,7 @@ packages:
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
image_picker:
......@@ -546,7 +530,7 @@ packages:
description:
name: image_picker
sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
image_picker_android:
......@@ -554,7 +538,7 @@ packages:
description:
name: image_picker_android
sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.8.13+17"
image_picker_for_web:
......@@ -562,7 +546,7 @@ packages:
description:
name: image_picker_for_web
sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
image_picker_ios:
......@@ -570,7 +554,7 @@ packages:
description:
name: image_picker_ios
sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.8.13+6"
image_picker_linux:
......@@ -578,7 +562,7 @@ packages:
description:
name: image_picker_linux
sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
image_picker_macos:
......@@ -586,7 +570,7 @@ packages:
description:
name: image_picker_macos
sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2+1"
image_picker_platform_interface:
......@@ -594,7 +578,7 @@ packages:
description:
name: image_picker_platform_interface
sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.11.1"
image_picker_windows:
......@@ -602,15 +586,47 @@ packages:
description:
name: image_picker_windows
sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
in_app_purchase:
dependency: "direct main"
description:
name: in_app_purchase
sha256: "5cddd7f463f3bddb1d37a72b95066e840d5822d66291331d7f8f05ce32c24b6c"
url: "https://pub.dev"
source: hosted
version: "3.2.3"
in_app_purchase_android:
dependency: transitive
description:
name: in_app_purchase_android
sha256: "518b48a385dfc1aa278080472969c6cee0c3d41ef8b9511b0071dd015473ecf1"
url: "https://pub.dev"
source: hosted
version: "0.4.0+11"
in_app_purchase_platform_interface:
dependency: transitive
description:
name: in_app_purchase_platform_interface
sha256: "1d353d38251da5b9fea6635c0ebfc6bb17a2d28d0e86ea5e083bf64244f1fb4c"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
in_app_purchase_storekit:
dependency: transitive
description:
name: in_app_purchase_storekit
sha256: f2cf3a6c5233f8f43b4bb148e658be881441f33c3d285fe6ae8348c4994e1a75
url: "https://pub.dev"
source: hosted
version: "0.4.9"
intl:
dependency: "direct main"
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.20.2"
jni:
......@@ -618,7 +634,7 @@ packages:
description:
name: jni
sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
jni_flutter:
......@@ -626,7 +642,7 @@ packages:
description:
name: jni_flutter
sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
js:
......@@ -634,15 +650,23 @@ packages:
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.6.7"
json_annotation:
dependency: transitive
description:
name: json_annotation
sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80"
url: "https://pub.dev"
source: hosted
version: "4.12.0"
just_audio:
dependency: "direct main"
description:
name: just_audio
sha256: f978d5b4ccea08f267dae0232ec5405c1b05d3f3cd63f82097ea46c015d5c09e
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.46"
just_audio_platform_interface:
......@@ -650,7 +674,7 @@ packages:
description:
name: just_audio_platform_interface
sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.6.0"
just_audio_web:
......@@ -658,7 +682,7 @@ packages:
description:
name: just_audio_web
sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.4.16"
leak_tracker:
......@@ -666,7 +690,7 @@ packages:
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "11.0.2"
leak_tracker_flutter_testing:
......@@ -674,7 +698,7 @@ packages:
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.10"
leak_tracker_testing:
......@@ -682,7 +706,7 @@ packages:
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
lints:
......@@ -690,7 +714,7 @@ packages:
description:
name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
logger:
......@@ -698,7 +722,7 @@ packages:
description:
name: logger
sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.7.0"
logging:
......@@ -706,7 +730,7 @@ packages:
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
matcher:
......@@ -714,7 +738,7 @@ packages:
description:
name: matcher
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.12.19"
material_color_utilities:
......@@ -722,7 +746,7 @@ packages:
description:
name: material_color_utilities
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.13.0"
meta:
......@@ -730,7 +754,7 @@ packages:
description:
name: meta
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.17.0"
mime:
......@@ -738,39 +762,31 @@ packages:
description:
name: mime
sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.6"
native_toolchain_c:
dependency: transitive
description:
name: native_toolchain_c
sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.17.6"
nm:
dependency: transitive
description:
name: nm
sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.5.0"
objective_c:
dependency: transitive
description:
name: objective_c
sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52"
url: "https://pub.flutter-io.cn"
sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed"
url: "https://pub.dev"
source: hosted
version: "9.3.0"
version: "9.4.1"
oktoast:
dependency: "direct main"
description:
name: oktoast
sha256: f1366c5c793ddfb8f55bc6fc3e45db43c45debf173b765fb4c5ec096cbdeb84a
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.4.0"
package_config:
......@@ -778,7 +794,7 @@ packages:
description:
name: package_config
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
package_info_plus:
......@@ -786,7 +802,7 @@ packages:
description:
name: package_info_plus
sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.2.0"
package_info_plus_platform_interface:
......@@ -794,7 +810,7 @@ packages:
description:
name: package_info_plus_platform_interface
sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
path:
......@@ -802,7 +818,7 @@ packages:
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path_drawing:
......@@ -810,7 +826,7 @@ packages:
description:
name: path_drawing
sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
path_parsing:
......@@ -818,7 +834,7 @@ packages:
description:
name: path_parsing
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
path_provider:
......@@ -826,7 +842,7 @@ packages:
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
......@@ -834,7 +850,7 @@ packages:
description:
name: path_provider_android
sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
path_provider_foundation:
......@@ -842,7 +858,7 @@ packages:
description:
name: path_provider_foundation
sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.6.0"
path_provider_linux:
......@@ -850,7 +866,7 @@ packages:
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
......@@ -858,7 +874,7 @@ packages:
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
......@@ -866,7 +882,7 @@ packages:
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.0"
permission_handler:
......@@ -874,7 +890,7 @@ packages:
description:
name: permission_handler
sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "12.0.1"
permission_handler_android:
......@@ -882,7 +898,7 @@ packages:
description:
name: permission_handler_android
sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "13.0.1"
permission_handler_apple:
......@@ -890,7 +906,7 @@ packages:
description:
name: permission_handler_apple
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "9.4.7"
permission_handler_html:
......@@ -898,7 +914,7 @@ packages:
description:
name: permission_handler_html
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.1.3+5"
permission_handler_platform_interface:
......@@ -906,7 +922,7 @@ packages:
description:
name: permission_handler_platform_interface
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.3.0"
permission_handler_windows:
......@@ -914,7 +930,7 @@ packages:
description:
name: permission_handler_windows
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
petitparser:
......@@ -922,7 +938,7 @@ packages:
description:
name: petitparser
sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "7.0.2"
platform:
......@@ -930,7 +946,7 @@ packages:
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
......@@ -938,7 +954,7 @@ packages:
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
pointycastle:
......@@ -946,7 +962,7 @@ packages:
description:
name: pointycastle
sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.9.1"
pub_semver:
......@@ -954,7 +970,7 @@ packages:
description:
name: pub_semver
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
rational:
......@@ -962,7 +978,7 @@ packages:
description:
name: rational
sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.3"
record_use:
......@@ -970,7 +986,7 @@ packages:
description:
name: record_use
sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
rxdart:
......@@ -978,7 +994,7 @@ packages:
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.28.0"
shared_preferences:
......@@ -986,7 +1002,7 @@ packages:
description:
name: shared_preferences
sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.5.5"
shared_preferences_android:
......@@ -994,7 +1010,7 @@ packages:
description:
name: shared_preferences_android
sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.23"
shared_preferences_foundation:
......@@ -1002,7 +1018,7 @@ packages:
description:
name: shared_preferences_foundation
sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.5.6"
shared_preferences_linux:
......@@ -1010,7 +1026,7 @@ packages:
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
......@@ -1018,7 +1034,7 @@ packages:
description:
name: shared_preferences_platform_interface
sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
shared_preferences_web:
......@@ -1026,7 +1042,7 @@ packages:
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
shared_preferences_windows:
......@@ -1034,7 +1050,7 @@ packages:
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine:
......@@ -1047,7 +1063,7 @@ packages:
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.10.2"
sqflite:
......@@ -1055,7 +1071,7 @@ packages:
description:
name: sqflite
sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2+1"
sqflite_android:
......@@ -1063,23 +1079,23 @@ packages:
description:
name: sqflite_android
sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2+3"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
sha256: f8a08a13fb8f0f8c590df89d745000bed44a673ed94bac846739e1a016875c21
url: "https://pub.flutter-io.cn"
sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465"
url: "https://pub.dev"
source: hosted
version: "2.5.7"
version: "2.5.8"
sqflite_darwin:
dependency: transitive
description:
name: sqflite_darwin
sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
sqflite_platform_interface:
......@@ -1087,7 +1103,7 @@ packages:
description:
name: sqflite_platform_interface
sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
stack_trace:
......@@ -1095,7 +1111,7 @@ packages:
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
......@@ -1103,7 +1119,7 @@ packages:
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
string_scanner:
......@@ -1111,7 +1127,7 @@ packages:
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
synchronized:
......@@ -1119,7 +1135,7 @@ packages:
description:
name: synchronized
sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.4.0+1"
term_glyph:
......@@ -1127,7 +1143,7 @@ packages:
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
......@@ -1135,7 +1151,7 @@ packages:
description:
name: test_api
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.7.10"
tobias:
......@@ -1143,7 +1159,7 @@ packages:
description:
name: tobias
sha256: "32836a9dae348d1c3f5f4247ed0a6a409fd5b9ddf490b06966a0fad2fd02cb7a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.3.2"
typed_data:
......@@ -1151,7 +1167,7 @@ packages:
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
uuid:
......@@ -1159,7 +1175,7 @@ packages:
description:
name: uuid
sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.5.3"
vector_math:
......@@ -1167,7 +1183,7 @@ packages:
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
vm_service:
......@@ -1175,7 +1191,7 @@ packages:
description:
name: vm_service
sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "15.2.0"
web:
......@@ -1183,7 +1199,7 @@ packages:
description:
name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
win32:
......@@ -1191,7 +1207,7 @@ packages:
description:
name: win32
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.15.0"
xdg_directories:
......@@ -1199,23 +1215,23 @@ packages:
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xml:
dependency: transitive
description:
name: xml
sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
url: "https://pub.flutter-io.cn"
sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4"
url: "https://pub.dev"
source: hosted
version: "6.6.1"
version: "7.0.1"
yaml:
dependency: transitive
description:
name: yaml
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.3"
sdks:
......
......@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.1+5
version: 1.0.1+6
environment:
sdk: '>=3.0.0 <4.0.0'
......@@ -95,7 +95,7 @@ dependencies:
# 支付宝
tobias: ^3.3.0
# 内购
flutter_inapp_purchase: ^5.6.1
in_app_purchase: ^3.2.1
encrypt: ^5.0.3
# 阿里oss直传
flutter_oss_aliyun: ^6.4.1
......
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论