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

Flutter in_app_purchase的purchaseUpdatedStream监听事件未触发

问题排查与解决方案

核心问题分析

  1. Stream订阅被提前销毁:purchaseInit()方法里的_subscription是局部变量,方法执行完毕后变量被回收,导致订阅被自动取消,监听回调根本不会触发。
  2. 未主动触发恢复购买:应用启动时,purchaseStream不会自动推送已购/恢复的产品记录,必须主动调用恢复接口才能让订阅收到数据。

修复步骤

1. 保留订阅引用,避免被回收

把_subscription改成类的成员变量,确保订阅在生命周期内持续有效:

// 移到类成员位置,不要放在purchaseInit方法里
StreamSubscription<List<PurchaseDetails>>? _subscription;

void purchaseInit() {
  final Stream purchaseUpdated = InAppPurchase.instance.purchaseStream;
  _subscription = purchaseUpdated.listen((purchaseDetailsList) {
    logger.i("purchaseInit"); // 现在应该能打印了
    _listenToPurchaseUpdated(purchaseDetailsList);
  }, onDone: () {
    _subscription?.cancel();
  }, onError: (error) {
    // 处理错误逻辑
  });
}

2. 启动时主动触发恢复购买

在purchaseInit()末尾添加恢复购买的调用,这样订阅才能收到已购产品的回调:

void purchaseInit() {
  // 原有的订阅代码...
  
  // 主动请求恢复已购产品
  InAppPurchase.instance.restorePurchases();
}

3. 补充生命周期管理(可选但推荐)

在页面销毁时取消订阅,避免内存泄漏:

@override
void dispose() {
  _subscription?.cancel();
  super.dispose();
}

额外注意事项

  • 确保InAppPurchase.instance.isAvailable()返回true再执行订阅和恢复操作,避免在服务不可用时做无效操作。
  • 检查权限配置(比如iOS的App Store Connect配置、Android的Google Play Billing权限),权限缺失也可能导致恢复购买无响应。

内容的提问来源于stack exchange,提问作者Neli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:15:33