Flutter订阅后如何关闭开屏广告?
解决Flutter订阅后关闭开屏广告的方案
1. 创建Getx订阅状态控制器
全局维护订阅状态,确保状态在应用内共享且持久化:
class SubscriptionController extends GetxController { final RxBool isSubscribed = false.obs; @override void onInit() { super.onInit(); // 应用启动时检查订阅状态(从本地存储或IAP恢复) checkSubscriptionStatus(); } Future<void> checkSubscriptionStatus() async { // 示例:从SharedPreferences读取缓存状态 final prefs = await SharedPreferences.getInstance(); isSubscribed.value = prefs.getBool('is_subscribed') ?? false; } void setSubscribed(bool value) { isSubscribed.value = value; // 保存状态到本地,避免重启后丢失 SharedPreferences.getInstance().then((prefs) => prefs.setBool('is_subscribed', value)); } }
2. 订阅成功时更新状态
修改IAPService的成功购买处理逻辑,同步更新Getx状态:
class IAPService { final subscriptionController = Get.find<SubscriptionController>(); void _handleSuccessfulPurchase(PurchaseDetails purchaseDetails) async { // 这里添加订单验证、服务器同步等逻辑 // ... // 更新订阅状态为已订阅 subscriptionController.setSubscribed(true); if (kDebugMode) { print("订阅状态更新:已开启"); } } // 原有listenToPurchaseUpdated方法保持不变 }
3. 调整支付页面的订阅流监听
避免重复创建IAPService实例,确保状态更新生效:
@override void initState() { super.initState(); getuser(); futureData = accountController.fetchAccounts(); // 复用同一个IAPService实例 final iapService = Get.put(IAPService()); final Stream purchaseUpdated = InAppPurchase.instance.purchaseStream; iapSubscription = purchaseUpdated.listen((purchaseDetailsList) { if (kDebugMode) { print("Purchase stream started"); } iapService.listenToPurchaseUpdated(purchaseDetailsList); }, onDone: () { iapSubscription.cancel(); }, onError: (error) { iapSubscription.cancel(); }) as StreamSubscription<List<PurchaseDetails>>; initStoreInfo(); }
4. 修改HomeScreen广告触发逻辑
根据订阅状态决定是否展示开屏广告:
class HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateMixin, WidgetsBindingObserver { AppOpenManager appOpenManager = AppOpenManager(); bool isPaused = false; final subscriptionController = Get.find<SubscriptionController>(); @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); if (state == AppLifecycleState.resumed) { isPaused = false; // 仅未订阅用户展示开屏广告 if (!subscriptionController.isSubscribed.value) { appOpenManager.showAdIfAvailable(); } } else if (state == AppLifecycleState.paused) { isPaused = true; } } // 原有其他方法保持不变 }
5. 初始化Getx控制器
在应用启动时初始化订阅控制器,确保全局可用:
void main() async { WidgetsFlutterBinding.ensureInitialized(); Get.put(SubscriptionController()); runApp(const MyApp()); }
内容的提问来源于stack exchange,提问作者Emad Younan
相关产品推荐
相关产品推荐

