Updated the Flutter core SDK dependencies to Android Storyteller 11.6.4
and iOS Storyteller 11.6.1.
Updated the Flutter GAM SDK dependencies to Android core and GAM v24
11.6.4, and iOS Storyteller SDK and GAM integration 11.6.1.
Added a separate Flutter AdMob package using Android core and shared ads v24
11.6.4, with iOS Storyteller SDK and GAM integration 11.6.1.
Added a separate Flutter VAST package using Android core and VAST 11.6.4,
and iOS core and VAST integration 11.6.1.
iOS consumers must add the Storyteller Lottie podspec source to their
Podfile; Storyteller SDK 11.6.1 resolves StorytellerLottie4.6.0
from that repository.
Added custom share handling with setUseCustomShareHandling and
onShareButtonTapped.
Added getFollowableCategories for retrieving followable category metadata.
Added Flutter mappings for target-native analytics payload fields, including
ad session, paid ad, audio toggle, mute state, and analytics exclusion fields.
Added Clips like button Lottie animation theme support and poll image answer
gradient overlay configuration.
Added category metadata to list tile callbacks via categoryDetails, while
preserving existing category ID lists.
Added bottomBannerAdUnit support for Clips bottom banner GAM placements.
Added the optional storyteller_admob_sdk package with dynamic native and
banner units, native/banner fallback priority, Clips bottom banners, custom
KVPs, and runtime GAM/AdMob facade selection in a shared dependency graph.
Added Google-facade disable() APIs so integrating-app Client Ads can own
eligible inventory while VAST remains registered.
Added StorytellerCardView for native Cards collections on Android and iOS,
including analytics context, data-load callbacks, controller-driven reload,
and dynamic native sizing.
Added setClientAdProvider with typed Stories/Clips requests and URL-based
image/video responses for host-supplied integrating-app ads, including
tracking pixels, actions, source attribution, timeout, and stale-response
protection on Android and iOS.
Added Flutter theme mappings for Cards audio icons, player mute/captions/back
icons, Clips presentation and spacing, and the expanded Search appearance
contract available in the target native SDKs.
Added typed tileIndex, analytics context, list-position, and SDK
initialization fields while preserving raw event names and every payload key
delivered by the platform bridge.
Added cross-platform player-presentation aliases and iOS player mute-state
access with explicit unsupported behavior on Android.
Added full custom-attribute replacement, nullable locale clearing, batch
followed-category removal, and awaited followed-category replacement.
Added explicit open-reason attribution, native-spelling deep-link and
collection-external-ID aliases, and optional per-presentation Clips ad
controls for fullscreen and Embedded Clips entry points.
Added Android category-based Clips counts and cancellable Clips preloading
with documented iOS capability behavior.
Added Android 11.6.3 between-Clips provider ordering for fullscreen,
Embedded, row, and grid presentations.
Added request-correlated, sanitized late Clips-open errors and optional
Android client-ad contentId payloads.
Added the optional storyteller_vast_sdk package for generic and GAM VAST
full-screen ads, typed static/dynamic request parameters, safe timeout
fallback, deterministic VAST-only module replacement, and sanitized
diagnostics.
Fixed isCategoryFollowed on Android, which previously resulted in a
MissingPluginException.
Fixed internal Story and Clip CTAs in Android Stories Rows and Grids so
dismissing the current player continues to open the selected target.
Preserved the published StorytellerCardView constructor surface while
introducing collection-backed native Cards, so existing applications remain
source-compatible when upgrading.
Allowed main-content and bottom-banner ad-unit callbacks to resolve
independently instead of sharing one timeout queue on Android.
Fixed Android GAM requests made on the main thread skipping dynamic
full-screen ad-unit callbacks.
Prevented immediate Clips-open failures from also being emitted as late-error
events; those failures continue to reject the returned Future.
Restored the prior Android custom-attribute map when full replacement fails,
then returned a structured CUSTOM_ATTRIBUTES_ERROR.
The core storyteller_sdk iOS podspec remains at iOS 13.0 to match the
native StorytellerSDK support floor; the example app and GAM integration
target iOS 15.0.
Cards are rendered by the native SDKs. Flutter owns the platform-view bridge,
callback mapping, and height updates after native content loads.
StorytellerCardView.collectionId must be non-blank to render Cards content.
The older storyId, clipId, theme, and onTileTapped arguments remain as
deprecated source-compatibility shims and do not enable legacy card content.
Android analytics now surfaces adIndex as an int in the raw fields map,
matching the typed Dart API and iOS payload shape.
Android analytics no longer emits collectionOffset, which is not exposed by
the native Android 11.6.3 activity data contract.
StorytellerCategoryDetail.placement now preserves absent native placement
values as null instead of converting them to an empty string.
Search filter visibility, Following-feed selection style, modal Clips
anchoring, and followable-category profile content remain tenant/native
settings rather than local Flutter theme fields.
Cards unavailableIcon, player showMoreButton, and player close/more icons
are Android-only; iOS safely ignores those optional map keys.
Omitting a Clips ad configuration preserves the linked native SDK's defaults;
an explicitly supplied configuration sends only its supported, non-null
fields. Android provider order distinguishes native order, an empty disabled
provider set, and an explicitly ordered provider list.
Android's native external-ID collection open always uses deep-link
attribution and rejects an explicit instanceMethod reason. iOS supports
both reasons for the equivalent Flutter helper.
getClipsCount(String) remains source compatible: iOS interprets its value
as a collection ID, while Android 11.6.3 interprets it as one category ID.
Use getClipsCountForCategories for explicit Android category queries.
Programmatic Clips opens continue to reject their Future for invalid
arguments and immediate/awaited native failures. Android callback-style late
failures use onClipsOpenError; subscribe before opening when those events
matter.
VAST request construction, fetching, parsing, wrapper resolution, media
selection, playback, tracking, fallback, and analytics remain native-owned.
Dynamic ad unit selection per request based on placement/category/experiment
Custom native template ID mapping for stories and clips
Platform channel bridge to native GAM SDKs
{"slug": "changelog", "page_title": "Changelog", "page_url": "Changelog/", "canonical_url": "/flutter/Changelog/", "markdown": "# Changelog\n\n## **11.6.5** - 20/08/2026\n\n- Simplified package READMEs to direct installation, configuration, and usage\n guidance to the public Flutter documentation and Showcase.\n\n## **11.6.4** - 19/08/2026\n\n### Native SDKs\n\n- Updated the Flutter core SDK dependencies to Android Storyteller `11.6.4`\n and iOS Storyteller `11.6.1`.\n- Updated the Flutter GAM SDK dependencies to Android core and GAM v24\n `11.6.4`, and iOS Storyteller SDK and GAM integration `11.6.1`.\n- Added a separate Flutter AdMob package using Android core and shared ads v24\n `11.6.4`, with iOS Storyteller SDK and GAM integration `11.6.1`.\n- Added a separate Flutter VAST package using Android core and VAST `11.6.4`,\n and iOS core and VAST integration `11.6.1`.\n- iOS consumers must add the Storyteller Lottie podspec source to their\n `Podfile`; Storyteller SDK `11.6.1` resolves `StorytellerLottie` `4.6.0`\n from that repository.\n\n### New Features\n\n- Added custom share handling with `setUseCustomShareHandling` and\n `onShareButtonTapped`.\n- Added `getFollowableCategories` for retrieving followable category metadata.\n- Added Flutter mappings for target-native analytics payload fields, including\n ad session, paid ad, audio toggle, mute state, and analytics exclusion fields.\n- Added Clips like button Lottie animation theme support and poll image answer\n gradient overlay configuration.\n- Added category metadata to list tile callbacks via `categoryDetails`, while\n preserving existing category ID lists.\n- Added `bottomBannerAdUnit` support for Clips bottom banner GAM placements.\n- Added the optional `storyteller_admob_sdk` package with dynamic native and\n banner units, native/banner fallback priority, Clips bottom banners, custom\n KVPs, and runtime GAM/AdMob facade selection in a shared dependency graph.\n- Added Google-facade `disable()` APIs so integrating-app Client Ads can own\n eligible inventory while VAST remains registered.\n- Added `StorytellerCardView` for native Cards collections on Android and iOS,\n including analytics context, data-load callbacks, controller-driven reload,\n and dynamic native sizing.\n- Added `setClientAdProvider` with typed Stories/Clips requests and URL-based\n image/video responses for host-supplied integrating-app ads, including\n tracking pixels, actions, source attribution, timeout, and stale-response\n protection on Android and iOS.\n- Added Flutter theme mappings for Cards audio icons, player mute/captions/back\n icons, Clips presentation and spacing, and the expanded Search appearance\n contract available in the target native SDKs.\n- Added typed `tileIndex`, analytics `context`, list-position, and SDK\n initialization fields while preserving raw event names and every payload key\n delivered by the platform bridge.\n- Added cross-platform player-presentation aliases and iOS player mute-state\n access with explicit unsupported behavior on Android.\n- Added full custom-attribute replacement, nullable locale clearing, batch\n followed-category removal, and awaited followed-category replacement.\n- Added explicit open-reason attribution, native-spelling deep-link and\n collection-external-ID aliases, and optional per-presentation Clips ad\n controls for fullscreen and Embedded Clips entry points.\n- Added Android category-based Clips counts and cancellable Clips preloading\n with documented iOS capability behavior.\n- Added Android 11.6.3 between-Clips provider ordering for fullscreen,\n Embedded, row, and grid presentations.\n- Added request-correlated, sanitized late Clips-open errors and optional\n Android client-ad `contentId` payloads.\n- Added the optional `storyteller_vast_sdk` package for generic and GAM VAST\n full-screen ads, typed static/dynamic request parameters, safe timeout\n fallback, deterministic VAST-only module replacement, and sanitized\n diagnostics.\n\n### Bug Fixes\n\n- Fixed `isCategoryFollowed` on Android, which previously resulted in a\n `MissingPluginException`.\n- Fixed internal Story and Clip CTAs in Android Stories Rows and Grids so\n dismissing the current player continues to open the selected target.\n- Preserved the published `StorytellerCardView` constructor surface while\n introducing collection-backed native Cards, so existing applications remain\n source-compatible when upgrading.\n- Allowed main-content and bottom-banner ad-unit callbacks to resolve\n independently instead of sharing one timeout queue on Android.\n- Fixed Android GAM requests made on the main thread skipping dynamic\n full-screen ad-unit callbacks.\n- Prevented immediate Clips-open failures from also being emitted as late-error\n events; those failures continue to reject the returned `Future`.\n- Restored the prior Android custom-attribute map when full replacement fails,\n then returned a structured `CUSTOM_ATTRIBUTES_ERROR`.\n\n### Behavior Notes\n\n- The core `storyteller_sdk` iOS podspec remains at iOS 13.0 to match the\n native `StorytellerSDK` support floor; the example app and GAM integration\n target iOS 15.0.\n- Cards are rendered by the native SDKs. Flutter owns the platform-view bridge,\n callback mapping, and height updates after native content loads.\n- `StorytellerCardView.collectionId` must be non-blank to render Cards content.\n The older `storyId`, `clipId`, `theme`, and `onTileTapped` arguments remain as\n deprecated source-compatibility shims and do not enable legacy card content.\n- Android analytics now surfaces `adIndex` as an `int` in the raw `fields` map,\n matching the typed Dart API and iOS payload shape.\n- Android analytics no longer emits `collectionOffset`, which is not exposed by\n the native Android `11.6.3` activity data contract.\n- `StorytellerCategoryDetail.placement` now preserves absent native placement\n values as `null` instead of converting them to an empty string.\n- Search filter visibility, Following-feed selection style, modal Clips\n anchoring, and followable-category profile content remain tenant/native\n settings rather than local Flutter theme fields.\n- Cards `unavailableIcon`, player `showMoreButton`, and player close/more icons\n are Android-only; iOS safely ignores those optional map keys.\n- Omitting a Clips ad configuration preserves the linked native SDK's defaults;\n an explicitly supplied configuration sends only its supported, non-null\n fields. Android provider order distinguishes native order, an empty disabled\n provider set, and an explicitly ordered provider list.\n- Android's native external-ID collection open always uses deep-link\n attribution and rejects an explicit `instanceMethod` reason. iOS supports\n both reasons for the equivalent Flutter helper.\n- `getClipsCount(String)` remains source compatible: iOS interprets its value\n as a collection ID, while Android 11.6.3 interprets it as one category ID.\n Use `getClipsCountForCategories` for explicit Android category queries.\n- Programmatic Clips opens continue to reject their `Future` for invalid\n arguments and immediate/awaited native failures. Android callback-style late\n failures use `onClipsOpenError`; subscribe before opening when those events\n matter.\n- VAST request construction, fetching, parsing, wrapper resolution, media\n selection, playback, tracking, fallback, and analytics remain native-owned.\n\n## **11.1.0** - 03/02/2026\n\n### Breaking changes\n\n- `onTileTapped` in list views now provides a `StorytellerTileType` instead of a raw String id\n\n### Bug fixes\n\n- Resolved an issue where KVPs were missing on Android\n- Resolved an issue where the `onTileTapped` delegate callback was not invoked on iOS\n\n## **11.0.2** - 17/12/2025\n\n### Bug fixes\n\n- Fixed an issue where the customKvps callback was called only once in the GAM adapter\n- Fixed a rare issue related to the mute state on Android\n\n## **11.0.1** - 04/12/2025\n\n### Improvements\n\n- Decreased the minimum required version of the GAM dependency for the GAM module on iOS to 12.2\n\n## **11.0.0** - 14/11/2025\n\n### New Features\n\n- Added support for custom fonts on Android and iOS\n- Introduced the new [StorytellerHomeView component](https://github.com/getstoryteller/storyteller-showcase-flutter/blob/main/lib/screens/account/storyteller_home_screen.dart#L147)\n\n### Bug fixes\n\n- Fixed grid height calculations for non-scrollable layouts when the data count is lower than the display limit on Android\n\n## **11.0.0-alpha.3** - 06/11/2025\n\n### Improvements\n\n- Added support for Xcode 16.2\n\n## **11.0.0-alpha.2** - 29/10/2025\n\n### Bug fixes\n\n- Fixed issue where adUnit callback was not being invoked on iOS\n\n## **11.0.0-alpha.1** - 29/10/2025\n\n### storyteller_sdk\n\n#### SDK Initialization\n- `Storyteller.initialize()` with API key authentication and optional external ID\n- `StorytellerEventTrackingOptions` for personalization and ad tracking configuration\n- SDK state queries: `isInitialized()`, `version()`, `currentApiKey()`\n\n#### Widget Components\n- `StorytellerStoriesGridView` - Grid layout for stories with category filtering\n- `StorytellerStoriesRowView` - Horizontal scrolling row of stories\n- `StorytellerClipsGridView` - Grid layout for clips with collection support\n- `StorytellerClipsRowView` - Horizontal scrolling row of clips\n- `StorytellerEmbeddedClipsView` - Embedded clips player with playback controls\n\n#### Controllers\n- `StorytellerEmbeddedClipsController` for programmatic playback control\n- `StorytellerListViewController` for list and grid view management\n\n#### Content Navigation\n- Direct content opening: `openStory()`, `openPage()`, `openSheet()`, `openSearch()`\n- Collection support: `openCollection()`, `openCollectionWithCategory()`\n- External ID support: `openStoryByExternalId()`, `openClipByExternalId()`\n- Category navigation: `openCategory()`, `isCategoryFollowed()`\n- Content counts: `getStoriesCount()`, `getClipsCount()`\n\n#### User Management\n- Custom attributes: `setCustomAttribute()`, `removeCustomAttribute()`, `customAttributes()`\n- Locale configuration: `setLocale()`\n- Category following: `addFollowedCategory()`, `removeFollowedCategory()`, `followedCategories()`\n\n#### Theming System\n- `StorytellerTheme` with light/dark mode support\n- Component-specific themes: instructions, engagement units, polls, quizzes, search\n- Per-collection theme support in `openCollection()`\n\n#### Deep Linking\n- `isStorytellerDeeplink()` for URL validation\n- `openDeeplink()` for navigation handling\n- `isSearchEnabled()` query\n\n#### Player Controls\n- `dismissPlayer()` with animation and reason support\n- `resumePlayer()` for playback continuation\n- Player state queries: `isPlayerVisible()`, `isPresentingContent()`\n\n#### Event Streams\n- `onUserActivityOccurred` - All user interaction events\n- `userNavigatedToApp` - Link tap navigation events\n- `categoryFollowActionTaken` - Category follow/unfollow events\n- `onPlayerPresented` - Player presentation lifecycle\n- `onPlayerDismissed` - Player dismissal lifecycle\n- `onLog` - SDK debug logging\n\n### storyteller_gam_sdk\n\n#### Google Ad Manager Integration\n- `StorytellerGAMModule.setup()` for native SDK integration configuration\n- `StorytellerGAMModuleConfiguration` with dynamic ad unit callback\n- `StorytellerAdRequestInfo` providing placement, category, and experiment context\n- `StorytellerCustomNativeTemplateIds` for stories and clips ad templates\n\n#### Features\n- Dynamic ad unit selection per request based on placement/category/experiment\n- Custom native template ID mapping for stories and clips\n- Platform channel bridge to native GAM SDKs\n", "copy_markdown_include_header": false, "base_path": "", "ai_dir": "ai", "missing_payload_behavior": "empty"}