1.20.0 - Flutter
August 16th, 2026
Breaking changes
- The Moments Tabs bar now collapses when a container has 0 or 1 visible tabs. Set
isTabTitleVisibleWhenSingleTab: trueonBlazePlayerTabsStyleto keep it visible. - Replaced
promotedLabelswithcoldStartLabelsonBlazeRecommendationsType.forYou.coldStartLabelsfetches cold-start content for users below the interaction threshold (labels are OR'd and ordered by recency), rather than prioritizing labels within the recommendations.anyLabelFilteron the same type is now a non-nullableList<String>defaulting to[]. BlazeGAMBannerAdsDelegate.onGAMBannerAdsAdErrornow receives aBlazeGAMBannerAdsDelegateOnAdErrorParamsobject (errorMessage,extraInfo) instead of a bareString.multiAspectRatioonBlazeVideosPlaybackConfigurationis now optional (bool?). Omitting it falls through to the native SDK default, which changed totrue(previouslyfalse). Pass an explicit value to opt out of picking up native default changes automatically.
Added
Content and data sources
BlazeDataSourceType.compositecombines multiple independent data sources into a single deduplicated feed. Entries are fetched in parallel, merged in declaration order and deduplicated by item ID with first-occurrence-wins, through the newBlazeCompositeDataSourceEntryandBlazeCompositeDataSourceConfig(isMandatory) types. A non-mandatory entry that fails to fetch is dropped as long as one other entry succeeds. An empty entry list, and nesting a composite inside a composite, are rejected natively.BlazeVideosFilterParams(contentTypes,streamStates) with the newBlazeVideoContentType(video,stream) andBlazeLiveStreamStatus(live,upcoming,ended) enums. Passed asvideosFilterParamsonplayVideosandprepareVideos, and onBlazeVideosRowView/BlazeVideosGridView. Both fields default to no filtering on that dimension.BlazeOrderType.startTimeAscandBlazeOrderType.startTimeDesc, to order live/upcoming content by start time.BlazeDataSourcePersonalizedType.playerAndTeamIds(playerIds:, teamIds:)convenience constructor.labelsPriorityonBlazeDataSourcePersonalizedType.labelsis now optional and defaults to[].
Player control and events
BlazeSDK.pauseCurrentPlayer()andBlazeSDK.resumeCurrentPlayer(), to pause and resume the currently presented player.sourceIdon the entry point methods (playStory,playStories,prepareStories,playMoment,playMoments,prepareMoments,playVideo,playVideos,prepareVideos), and onhandleUniversalLinkandhandleNotificationPayload. It is surfaced in thesourceIdfield of the delegate callbacks triggered by the playback it starts.eventIdonplayStory.onShareClickedon all player delegates -BlazeWidgetDelegate,BlazePlayerEntryPointDelegateandBlazePlayerContainerTabsDelegate- withBlazeOnShareClickedParams(playerType,sourceId,id,contentType,title,description,sdkGeneratedLink,extraInfo) andBlazeShareContentType(story(pageId:),moment,video). Observer-only: the SDK always sharessdkGeneratedLinkand the callback cannot override it.sdkMetadataonBlazeOnTriggerCustomActionButtonParams- read-only metadata populated by the SDK with the content's extra info at the moment the button was clicked, alongside the app-suppliedappMetadata.
Playback configuration
adsonBlazeStoriesPlaybackConfiguration, through the newBlazeStoriesAdsPlaybackConfiguration(enablePreroll), to show a pre-roll ad on the first page the user interacts with. Disabled by default for backward compatibility.
Captions
BlazeCaptionsStyle(font,textSize,positioning) to style the rendered caption text, available ascaptionsonBlazeStoryPlayerStyle,BlazeMomentsPlayerStyleandBlazeVideosPlayerStyle.textSizeis Android-only - on iOS the size is baked intofont.BlazeCaptionsPositioning, withBlazeCaptionsXPosition(start,center,custom(offsetPercent:)) andBlazeCaptionsYPosition(top,center,bottom,custom(offsetPercent:)). Each axis is configured independently; custom offsets are percentages of the player width/height, coerced into0..100.captionsbutton inBlazeStoryPlayerButtonsStyleandBlazeMomentsPlayerButtonsStyle. Unlike the other button styles, the native default isisVisible: false, so the CC button must be opted into explicitly.cc_stateon theVideoPropsanalytics payload, reporting the captions state of the video. Analytics events reach the host app only through the typedBlazeAnalyticsEventmodel, so this field was previously dropped during parsing and is newly visible toBlazeGlobalDelegate.onEventTriggeredhandlers.
Player styles
borderColorandborderWidthonBlazeStoryPlayerCtaStyle,BlazeMomentsPlayerCtaStyleandBlazeVideosPlayerCtaStyle. A border color supplied by the backend/CMS takes precedence when present and parseable; these values are used otherwise.shouldPreserveLikesCountBelowThresholdonBlazeMomentsPlayerButtonsStyle, to keep the space below the like button reserved when the likes count is hidden, so buttons do not shift as the count crosses the display threshold.overlayVisibilityThresholdMsonBlazeVideosPlayerStyle, controlling how long the controls overlay stays visible before auto-hiding. Non-positive values are rejected natively and fall back to the SDK default.
Widgets
widgetIdis now optional on all row and grid widgets - a unique value is generated when it is omitted.widgetRemoteIdentifieron all row and grid widgets, for remote-managed widget configuration. When it resolves, the layout, data source and per-item style overrides come from the remote config and the locally supplied ones become no-ops; the widget falls back to the local data source if the remote fetch fails. Applied at widget creation only, and ignored by the Moments.tabs()constructors.BlazeMomentsWidgetController, a Moments-specific controller extendingBlazeWidgetControllerwithreloadAllTabs(),reloadNonActiveTabs(),reloadTab(index:)andreloadTabByContainerId(containerId:)for the fullscreen widget-to-tabs player.reloadTabandreloadTabByContainerIdare iOS only.activeTabIndicatoronBlazePlayerTabsStyle, through the newBlazePlayerActiveTabIndicatorStyle(isVisible,height), drawing an underline beneath the selected tab. Opt-in; the indicator color and width always follow the selected tab title.isTabVisibleWhenEmptyonBlazePlayerTabsStyle, to keep or auto-remove a Moments Tabs tab whose content is empty or fails to load. The first tab is always kept.isTabTitleVisibleWhenSingleTabonBlazePlayerTabsStyle- see Breaking changes.
SDK configuration and privacy
forceLayoutDirectiononBlazeSDK.initSDK(), with the newBlazeLayoutDirectionenum (ltr,rtl), to force the layout direction of the SDK's own screens independently of the device locale. When left unset, the SDK follows the system layout direction.BlazeSDK.setDisableUserActivity()to enable or disable the periodic user-activity sync that backs read/liked state and personalized recommendations, andBlazeSDK.clearLocalUserActivity()to clear locally cached user-activity data (liked/viewed content and interaction answers) and refresh widgets.BlazeSDK.hostingAppContext, a key-value store the hosting app populates for the SDK to read, surfaced to SDK features that consume host-app context such as in-player interactions:getValue(),getContext(),setValue(),setContext()anddeleteValue().setContext()clears every existing key first, so prefersetValue()/deleteValue()for incremental updates.
Ads
extraInfo(BlazeContentExtraInfo) onBlazeGAMBannerAdsDelegateOnAdEventParams, on the newBlazeGAMBannerAdsDelegateOnAdErrorParams, and onBlazeGAMCustomNativeAdsDelegateOnAdEventParams, carrying contextual metadata about the content surrounding the ad.adInfoonBlazeIMADelegateOnAdEventParams, through the newBlazeIMAAdInfotype (adId,adTitle,adDescription,adSystem,isSkippable,skipTimeOffset,adDuration,advertiserName,adTag,extraInfo). Every field is optional - the IMA SDK reports no ad information for some events, and individual fields are absent whenever the VAST response omits them.
