Adapty Flutter 创建 Paywall 时出现 variation 404 错误
结论
getPaywall 调用成功,只能说明 Adapty 找到了该 placement 对应的 paywall variation,并不表示这个 variation 已经配置了可供 AdaptyUI 渲染的 Paywall Builder 页面。
当前报错表示,生产环境中没有找到与返回的 paywall variation 匹配、locale 为 en,且 builder_version 为 2 的可视化配置。
常见原因包括:该 variation 没有关联并发布 Paywall Builder 页面、页面没有英文版本,或者使用的仍是与当前 AdaptyUI 不兼容的旧版 Builder 配置。
为什么两次调用结果不同
这两个调用获取的内容并不相同:
final paywall = await Adapty().getPaywall(
placementId: 'your_placement_id',
);
这一步主要获取 placement 的分配结果,以及 variation、产品和远程配置等 paywall 数据。即使 Dashboard 中只配置了商品或自定义付费墙,它也可能正常返回。
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
locale: 'en',
);
这一步需要读取 Paywall Builder 生成的完整界面配置。Adapty 后端会根据 variation、locale 和 Builder 版本查找对应页面,缺少其中任何一项都会返回 404。
错误中的 public_live_... 说明请求使用的是 live 配置。如果页面还只是草稿、发布在其他环境,或者线上 variation 没有关联这个页面,也会出现同样的问题。
解决步骤
先在 Adapty Dashboard 中确认当前 placement 实际返回的是哪个 variation,再逐项检查:
- 该 variation 是否关联了使用 Paywall Builder 创建的页面。
- Builder 页面是否已经保存并发布,而不只是草稿。
- 页面是否包含
en本地化版本。 - 页面和 placement 是否已经发布到应用当前使用的 live 环境。
- 当前安装的
adapty_flutter和adapty_ui_flutter版本是否兼容。 - 如果页面来自旧版 Builder,按照控制台提供的方式迁移或重新创建并发布,确保它能提供 Builder v2 配置。
如果使用了 A/B 测试,需要检查每一个 variation。假如只有一个 variation 配置了 Builder 页面,分配到其他 variation 的用户仍会收到 404。
代码调整
如果 Dashboard 中确实配置并发布了英文页面,可以继续显式传入 en:
final paywall = await Adapty().getPaywall(
placementId: 'your_placement_id',
);
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
locale: 'en',
);
await view.present();
如果 Builder 页面配置的是其他语言,应传入完全对应的 locale,例如:
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
locale: 'de',
);
也可以不显式指定 locale,由 SDK 按当前版本支持的默认语言规则进行选择:
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
);
await view.present();
但删除 locale: 'en' 不能代替 Dashboard 中的配置。目标 variation 仍然需要有已经发布的默认本地化页面。
如果使用的是自定义付费墙
如果 Dashboard 中只有商品和远程参数,没有使用 Paywall Builder,就不应调用 AdaptyUI().createPaywallView()。应用应使用 getPaywall() 返回的数据自行构建 Flutter 界面,并通过 Adapty SDK 完成购买。
简而言之:
- 使用 AdaptyUI:为每个可能返回的 variation 配置并发布相应语言的 Builder 页面。
- 使用自定义 UI:保留
getPaywall(),删除createPaywallView(),由应用自行渲染页面。
反复调用 getPaywall() 通常解决不了这个问题。需要确保返回的 variation、请求的 locale、Builder 版本与 live 环境中已经发布的页面一致。
备注:内容仅供参考。
