如何在Flutter安卓应用中实现广告展示与付费解锁功能?
Flutter 免费增值模式实现方案
一、广告集成与付费移除逻辑
- 集成广告SDK
使用google_mobile_ads包实现广告展示,在pubspec.yaml添加依赖后,初始化广告服务:
import 'package:google_mobile_ads/google_mobile_ads.dart'; void initAds() { MobileAds.instance.initialize(); }
- 广告展示控制
在需要展示广告的位置,通过判断用户是否购买去广告权限决定是否渲染广告:
Widget build(BuildContext context) { final hasRemovedAds = context.watch<PurchaseProvider>().hasRemovedAds; return Column( children: [ Expanded(child: YourMainContent()), if (!hasRemovedAds) BannerAdWidget(), ], ); }
- 去广告购买关联
用户完成去广告内购后,将状态持久化到本地(比如用shared_preferences),APP启动时读取该状态控制广告展示。
二、付费功能解锁实现
- 配置内购SDK
使用in_app_purchase包,在pubspec.yaml添加依赖后初始化购买客户端:
import 'package:in_app_purchase/in_app_purchase.dart'; final InAppPurchase _inAppPurchase = InAppPurchase.instance; late StreamSubscription<List<PurchaseDetails>> _purchaseSubscription; void initIAP() { _purchaseSubscription = _inAppPurchase.purchaseStream.listen((purchaseDetailsList) { _handlePurchaseUpdates(purchaseDetailsList); }); }
- 定义产品ID
在谷歌Play控制台创建对应内购产品(比如remove_ads、premium_feature_1),代码中维护产品ID列表:
const Set<String> _productIds = { 'remove_ads', 'premium_feature_1', };
- 加载产品与发起购买
// 加载产品信息 Future<void> loadProducts() async { final ProductDetailsResponse response = await _inAppPurchase.queryProductDetails(_productIds); if (response.notFoundIDs.isNotEmpty) { // 处理未找到的产品ID } _products = response.productDetails; } // 发起购买请求 void launchPurchase(ProductDetails product) { final PurchaseParam purchaseParam = PurchaseParam(productDetails: product); _inAppPurchase.buyNonConsumable(purchaseParam: purchaseParam); }
- 处理购买结果
void _handlePurchaseUpdates(List<PurchaseDetails> purchaseDetailsList) async { for (var purchaseDetails in purchaseDetailsList) { if (purchaseDetails.status == PurchaseStatus.purchased || purchaseDetails.status == PurchaseStatus.restored) { // 可选:服务器验证购买凭证 if (purchaseDetails.productID == 'remove_ads') { await _savePurchaseStatus('remove_ads', true); context.read<PurchaseProvider>().updateRemoveAdsStatus(true); } else if (purchaseDetails.productID == 'premium_feature_1') { await _savePurchaseStatus('premium_feature_1', true); context.read<PurchaseProvider>().updatePremiumFeature1Status(true); } } } } // 持久化购买状态 Future<void> _savePurchaseStatus(String key, bool value) async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool(key, value); }
- 功能解锁控制
在付费功能入口判断用户购买状态:
Widget build(BuildContext context) { final hasPremiumFeature1 = context.watch<PurchaseProvider>().hasPremiumFeature1; return hasPremiumFeature1 ? PremiumFeature1Widget() : ElevatedButton( onPressed: () => launchPurchase(_getProductById('premium_feature_1')), child: Text('解锁高级功能'), ); }
三、关键注意事项
- 购买状态持久化:必须将购买状态存在本地,同时支持调用
_inAppPurchase.restorePurchases()恢复购买 - 服务器验证:付费功能建议添加服务器端验证,防止本地篡改购买状态
- 测试:使用谷歌Play控制台测试账号测试内购,广告用官方测试ID避免产生真实收益
内容的提问来源于stack exchange,提问作者sadegh
相关产品推荐
相关产品推荐

