Flutter in_app_purchase的purchaseUpdatedStream监听事件未触发
问题排查与解决方案
核心问题分析
- Stream订阅被提前销毁:
purchaseInit()方法里的_subscription是局部变量,方法执行完毕后变量被回收,导致订阅被自动取消,监听回调根本不会触发。 - 未主动触发恢复购买:应用启动时,
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
相关产品推荐
相关产品推荐

