Skip to content

4.0.0

Choose a tag to compare

@x401om x401om released this 14 Jul 15:45
07cdd6c

⚠️ Major release with breaking API changes. The "paywall" concept is generalized into flow; most Paywall/paywall symbols are renamed to Flow/flow, and previously deprecated aliases are removed.

🚀 Flow — the successor to Paywalls

4.0.0 introduces Flow, which replaces the Paywall as the core unit of presentation and analytics. A flow can contain multiple screens, with its rendering, navigation, and analytics driven by the new flow runtime.

👉 Read more about Adapty Flow Builder.
👉 See the migration guide to move from 3.x.

📦 Requirements & installation

  • Minimum Flutter 3.32.0 (Dart 3.8.0).
  • [iOS] Minimum deployment target is now iOS 15; requires Xcode 26+ (the native iOS SDK uses Swift tools 6.2).
  • [iOS] CocoaPods support dropped — the iOS native SDK is now distributed via Swift Package Manager only. Apps on Flutter 3.32–3.43 must enable SPM once with flutter config --enable-swift-package-manager; Flutter 3.44+ enables it by default.

💥 Breaking changes

  • Paywall → Flow rename. AdaptyPaywall is split into AdaptyFlow (+ AdaptyFlowPaywall); AdaptyUIPaywallViewAdaptyUIFlowView; Adapty().getPaywall(...)getFlow(...) and getPaywallForDefaultAudience(...)getFlowForDefaultAudience(...); AdaptyUI().createPaywallView(...)createFlowView(...); logShowPaywall(...)logShowFlow(...).
  • Events observer renamed. AdaptyUIPaywallsEventsObserverAdaptyUIFlowsEventsObserver (setPaywallsEventsObserversetFlowsEventsObserver); all paywallViewDid* callbacks → flowViewDid*. The separate rendering-failure callback is folded into flowViewDidReceiveError.
  • AdaptyPaywallViewConfiguration is no longer exposed; the view configuration is now opaque.
  • Removed APIs deprecated back in 3.x: Adapty.setFallbackPaywalls() (use setFallback()), AdaptyConfigurationBuilder.withIdfaCollectionDisabled() (use withAppleIdfaCollectionDisabled()), AdaptyFlow.placementId / AdaptyFlow.revision (use placement.id / placement.revision), AdaptyPurchaseResultSuccess.jwsTransaction (use appleJwsTransaction), and AdaptyUIFlowView.paywallVariationId (use variationId).
  • Dismissing a flow or onboarding view now releases it from memory by default; a dismissed view can no longer be re-presented — create a new one instead.
  • [Android] The system back button no longer dismisses a flow by default. Handle AndroidSystemBackAction in your events observer if you want it to close the flow.

🆕 New

  • AdaptyUISystemRequestsHandler — handle flow system requests (OS permission prompts and App Store review requests) triggered by flow actions. Register via AdaptyUI().setSystemRequestsHandler(...).
  • AdaptyUIObserverModeResolver — drive purchases and restores initiated from flows while running in Observer Mode. Register via AdaptyUI().setObserverModeResolver(...).
  • flowViewDidReceiveAnalyticEvent — receive customer-facing analytic events emitted by a flow.
  • Adapty.openWebPaywall and Adapty.createWebPaywallUrl now accept an AdaptyFlowPaywall in addition to an AdaptyPaywallProduct.
  • setFlowsEventsObserver / setOnboardingsEventsObserver now accept null to detach a previously set observer, so the SDK no longer retains it (useful for cleanup).

⚠️ Deprecated

  • The Onboarding feature is deprecated; migrate to Flows. AdaptyOnboarding, AdaptyUIOnboardingView, AdaptyUIOnboardingPlatformView, AdaptyUIOnboardingsEventsObserver, the onboarding state / input / analytics models, and the related Adapty / AdaptyUI methods (getOnboarding, getOnboardingForDefaultAudience, create/present/dismissOnboardingView, register/unregister/setOnboardingsEventsObserver) are now annotated @Deprecated.

Full Changelog: 3.17.1...4.0.0