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
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.unknown case. The advertiser funnel has no unknown case: an advertiser outcome this plugin version doesn’t recognize reads as EncoreAdvertiserNotAttempted.
Related
- placement(): returns this record
- EncorePurchaseController: whose answer becomes
publisher - outcomes: carries this record for passive observers
- Errors: the
errorTypevalues