adpluga_flutter 0.7.1
adpluga_flutter: ^0.7.1 copied to clipboard
AdPluga Flutter SDK — banner, native, interstitial and rewarded ads served by the AdPluga edge.
Changelog #
All notable changes to the AdPluga Flutter SDK are documented in this file. The format follows Keep a Changelog and this project adheres to Semantic Versioning.
0.7.1 — 2026-09 #
Fixed #
- A slot that failed to fill stayed blank for the rest of the session. Only the success path armed the next attempt, so a transient miss — or a widget that mounted before the SDK was initialised — cost the publisher that slot until the view was recreated. Every failure path now schedules another attempt, backing off exponentially from the client's cadence floor up to five minutes. Retry is independent of the slot's rotation cadence, which is off by default: tying recovery to rotation is what made a single miss permanent.
0.7.0 — 2026-09 #
Fixed #
- Impressions are no longer counted for a slot the host is not painting. The
viewability check was pure geometry, so a banner on a hidden
IndexedStackpage or inside a collapsed viewport kept a valid rect and billed as fully viewable. It now consultsVisibility.ofand every ancestor paint clip, matching what the Android and iOS SDKs already did. - Tapping an image creative now opens the advertiser destination. HTML and video creatives always did; image ones reported the click and went nowhere, so the advertiser paid for a tap that never arrived.
initializewith a different publisher key now fails instead of quietly returning the existing instance. Rotating a key revokes the previous one at once, so the silent path left an app serving with a dead key. The same key stays idempotent; calldestroy()first to re-initialize deliberately.conversion()senttype/value; the API readsconv_type/value_cents, so both were dropped. The old argument names still work, deprecated.
Changed #
- Without an explicit
width/height, the banner now adopts the served creative's aspect ratio instead of pinning the box to its pixel size, so the fit is exact and a creative wider than the screen no longer overflows. A host that passes both dimensions still wins. endpointaccepts null to mean "use the default", andkDefaultEndpointis exported, so a host reading the endpoint from configuration no longer has to hardcode an AdPluga hostname.
0.6.0 — 2026-09 #
Added #
AdPlugaCarouselrenderstype=carouseldecks in aPageView. The deck is one advertiser and one auction: every card reports the same click and no card triggers another serve, so swiping costs no decisions and no extra impression.Slidemodel andAd.slides, parsed in the order the advertiser arranged; a slide without a creative is dropped rather than drawn blank.
Changed #
- A scheduled rotation now backs off while the reader is swiping the deck and resumes one full cadence after the last swipe.
- A slot cadence below the client floor is raised to it instead of being
ignored, so a slot set to 15s rotates every 15s on a
pk_test_key and every 30s on a live one — it never stops rotating.
0.5.1 — 2026-09 #
Fixed #
- Frequency capping and first-party audiences now work on mobile. The SDK
releases a first-party install id as
u(the parameter the server actually reads) whenever the consent state allows personalisation; without consent no id leaves the device and the server skips both gates, as before. - The id lives in memory for the process lifetime; pass
userHashexplicitly to key the daily cap across app launches.
0.5.0 — 2026-09 #
Added #
- Slot rotation: banners now re-serve on the cadence the publisher configures
for the slot (
refresh_after_secondson the serve response). Long-lived app screens no longer show a single frozen creative — the mobile equivalent of a web page reload. - Rotation is gated so it cannot waste the publisher's budget or produce
non-viewable impressions: it only fires while the ad meets the IAB pixel
threshold and the app is in the foreground, is floored at 30s
(
kMinRefreshSeconds), and the timer is cancelled on dispose and while backgrounded. - Each rotation sends its index (
rq) so refreshed impressions stay segregable from the initial render, as the MRC guidelines require.
0.4.1 — 2026-08 #
Added #
- Test-mode badge: creatives served by a
pk_test_(sandbox) key now render a small non-interactive "TEST" marker at the top-left of every ad surface (banner, native, HTML, video, interstitial, rewarded). Driven by the newtestboolean on the serve responseadobject (Ad.isTest). The badge is wrapped inIgnorePointerso it never intercepts taps.
0.4.0 — 2026-07 #
Added #
- Audio and video_rewarded ad kinds render via
AdPlugaVideowidget inAdPlugaBanner, enabling autoplay for all video/audio formats.
Fixed #
- QuartileFirer now resolves relative ping URLs against the SDK endpoint, fixing quartile tracking when the backend returns relative paths.
- Fixed
AdPluga.maybeInstance?.endpoint→AdPluga.maybeInstance?.config.endpointinAdPlugaVideowidget (2 occurrences).
0.3.0 — 2026-07 #
Added #
- IAB viewability dispatch:
AdPluga.fireViewable(resp, slotId)posts/v1/track/viewablewith the served track token. Banner, native, interstitial and rewarded widgets fire it from the same viewability callback that already recorded the impression.
0.2.0 — 2025-11 #
Added #
- HTML5 / WebView ad format via
webview_flutter. - Video and rewarded video formats via
video_playerwith VAST-style quartile beacons. - URL sandboxing for embedded creatives (only
http/httpsschemes).
Changed #
- Mandatory
AdPluga.initializegate — SDK operations now throw a clearStateErrorif invoked before initialization.