Skip to main content
What show() resolves to. Either nothing ever appeared, or the interaction ran and the record carries two independent funnels plus how the sheet went away. show() never throws on iOS or Android. Presentation-level failures arrive here as values.

Structure

The two funnels are independent, not competing cases: a single presentation can claim an offer and run a purchase, and both are recorded. notAttempted is a real value, meaning “the funnel was open and nothing entered it”, never a missing one.

Reading it

The fact readers give you one axis at a time:
EncorePresentationResult is sealed, so Dart 3 gives you an exhaustive switch when the mechanism matters:

EncorePublisherOutcome

Your funnel: what your purchase controller reported back. Treat pending as neither a purchase nor an abandonment; see EncorePurchaseController for what it means.

EncoreAdvertiserOutcome

Encore’s funnel: how far the offer claim got. A sealed class with five cases.
result.claim is shorthand for the offer behind a Claimed or Verified outcome, and null otherwise. Read advertiser directly when you need to tell the two apart.

EncoreClaimedOffer

transactionId is the one to keep. The brand-side completion can land days later and reaches your server through the offer-completed webhook, which carries the same value. It is the only way to match this result to the completion it eventually produces.

EncoreDismissReason

How a presented sheet went away. See EncoreDismissReason for every value.

EncoreNotPresentedReason

Why no sheet ever appeared.
EncoreNotPresented is not a synonym for failure. noOffers, experimentControl, and useCaseUnavailable are healthy states that still need your original flow to continue. Run your fallback for every reason, and log only error.
The three enums decode an unrecognized wire value to their explicit unknown case. The advertiser funnel has no unknown case: an advertiser outcome this plugin version doesn’t recognize reads as EncoreAdvertiserNotAttempted.