You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:07:48