PAYATHON 2026

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,再逐项检查:

  1. 该 variation 是否关联了使用 Paywall Builder 创建的页面。
  2. Builder 页面是否已经保存并发布,而不只是草稿。
  3. 页面是否包含 en 本地化版本。
  4. 页面和 placement 是否已经发布到应用当前使用的 live 环境。
  5. 当前安装的 adapty_flutter 和 adapty_ui_flutter 版本是否兼容。
  6. 如果页面来自旧版 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 环境中已经发布的页面一致。

备注:内容仅供参考。