Go_Router重定向逻辑引发购买后无限循环问题求助
GoRouter跳转无限循环问题原因及解决方法
问题原因
购买成功后,RevenueCatProvider中的entitlement状态没有及时更新,导致GoRouter的redirect方法仍然读取到旧的Entitlement.free状态。当调用context.go('/')跳转到首页时,redirect逻辑会再次触发,判断权限仍为免费,又将用户重定向到/trialwall,从而形成无限循环。
同时,当前的redirect逻辑没有排除用户已经在/trialwall页面的情况——即使用户处于试用墙页面,只要权限是免费,就会重复触发跳转,进一步加剧循环问题。
解决方法
1. 购买成功后主动刷新权限状态
在购买成功的回调中,主动获取最新的用户权限信息,并更新RevenueCatProvider中的entitlement值,确保状态同步:
Future<void> _startTrial(BuildContext context) async { setState(() { _isLoading = true; }); try { await Purchases.purchasePackage(widget.offering!.monthly!); // 获取最新的用户权限信息 final customerInfo = await Purchases.getCustomerInfo(); // 更新Provider中的权限状态 Provider.of<RevenueCatProvider>(context, listen: false) .updateEntitlement(customerInfo); context.go('/'); } catch (e) { print("购买失败: $e"); } finally { setState(() { _isLoading = false; }); } }
需要在RevenueCatProvider中添加状态更新方法:
class RevenueCatProvider extends ChangeNotifier { Entitlement _entitlement = Entitlement.free; Entitlement get entitlement => _entitlement; void updateEntitlement(CustomerInfo customerInfo) { // 根据实际RevenueCat返回的权限结构调整判断逻辑 _entitlement = customerInfo.entitlements.active.isNotEmpty ? Entitlement.premium : Entitlement.free; notifyListeners(); } }
2. 优化redirect逻辑,避免重复跳转
在redirect方法中,判断用户当前是否已经处于/trialwall页面,如果是且权限为免费,则不执行重定向:
redirect: (context, state) async { if (prefs.getBool('seen') != true) { return '/onboarding'; } var userModel = await DatabaseHelper().getAllUsers(); if (userModel.isEmpty) { return '/input'; } Entitlement entitlement = Provider.of<RevenueCatProvider>(context, listen: false).entitlement; // 仅当用户不在trialwall页面且权限为免费时,才跳转试用墙 if (entitlement == Entitlement.free && state.location != '/trialwall') { return '/trialwall'; } return '/'; },
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

