GuidesAPI ReferenceRelease Notes
HomeLog InHome
Release Notes

1.20.0 - Flutter


Breaking changes

  • The Moments Tabs bar now collapses when a container has 0 or 1 visible tabs. Set isTabTitleVisibleWhenSingleTab: true on BlazePlayerTabsStyle to keep it visible.
  • Replaced promotedLabels with coldStartLabels on BlazeRecommendationsType.forYou. coldStartLabels fetches cold-start content for users below the interaction threshold (labels are OR'd and ordered by recency), rather than prioritizing labels within the recommendations. anyLabelFilter on the same type is now a non-nullable List<String> defaulting to [].
  • BlazeGAMBannerAdsDelegate.onGAMBannerAdsAdError now receives a BlazeGAMBannerAdsDelegateOnAdErrorParams object (errorMessage, extraInfo) instead of a bare String.
  • multiAspectRatio on BlazeVideosPlaybackConfiguration is now optional (bool?). Omitting it falls through to the native SDK default, which changed to true (previously false). Pass an explicit value to opt out of picking up native default changes automatically.

Added

Content and data sources

  • BlazeDataSourceType.composite combines 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 new BlazeCompositeDataSourceEntry and BlazeCompositeDataSourceConfig (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 new BlazeVideoContentType (video, stream) and BlazeLiveStreamStatus (live, upcoming, ended) enums. Passed as videosFilterParams on playVideos and prepareVideos, and on BlazeVideosRowView / BlazeVideosGridView. Both fields default to no filtering on that dimension.
  • BlazeOrderType.startTimeAsc and BlazeOrderType.startTimeDesc, to order live/upcoming content by start time.
  • BlazeDataSourcePersonalizedType.playerAndTeamIds(playerIds:, teamIds:) convenience constructor.
  • labelsPriority on BlazeDataSourcePersonalizedType.labels is now optional and defaults to [].

Player control and events

  • BlazeSDK.pauseCurrentPlayer() and BlazeSDK.resumeCurrentPlayer(), to pause and resume the currently presented player.
  • sourceId on the entry point methods (playStory, playStories, prepareStories, playMoment, playMoments, prepareMoments, playVideo, playVideos, prepareVideos), and on handleUniversalLink and handleNotificationPayload. It is surfaced in the sourceId field of the delegate callbacks triggered by the playback it starts.
  • eventId on playStory.
  • onShareClicked on all player delegates - BlazeWidgetDelegate, BlazePlayerEntryPointDelegate and BlazePlayerContainerTabsDelegate - with BlazeOnShareClickedParams (playerType, sourceId, id, contentType, title, description, sdkGeneratedLink, extraInfo) and BlazeShareContentType (story(pageId:), moment, video). Observer-only: the SDK always shares sdkGeneratedLink and the callback cannot override it.
  • sdkMetadata on BlazeOnTriggerCustomActionButtonParams - read-only metadata populated by the SDK with the content's extra info at the moment the button was clicked, alongside the app-supplied appMetadata.

Playback configuration

  • ads on BlazeStoriesPlaybackConfiguration, through the new BlazeStoriesAdsPlaybackConfiguration (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 as captions on BlazeStoryPlayerStyle, BlazeMomentsPlayerStyle and BlazeVideosPlayerStyle. textSize is Android-only - on iOS the size is baked into font.
  • BlazeCaptionsPositioning, with BlazeCaptionsXPosition (start, center, custom(offsetPercent:)) and BlazeCaptionsYPosition (top, center, bottom, custom(offsetPercent:)). Each axis is configured independently; custom offsets are percentages of the player width/height, coerced into 0..100.
  • captions button in BlazeStoryPlayerButtonsStyle and BlazeMomentsPlayerButtonsStyle. Unlike the other button styles, the native default is isVisible: false, so the CC button must be opted into explicitly.
  • cc_state on the VideoProps analytics payload, reporting the captions state of the video. Analytics events reach the host app only through the typed BlazeAnalyticsEvent model, so this field was previously dropped during parsing and is newly visible to BlazeGlobalDelegate.onEventTriggered handlers.

Player styles

  • borderColor and borderWidth on BlazeStoryPlayerCtaStyle, BlazeMomentsPlayerCtaStyle and BlazeVideosPlayerCtaStyle. A border color supplied by the backend/CMS takes precedence when present and parseable; these values are used otherwise.
  • shouldPreserveLikesCountBelowThreshold on BlazeMomentsPlayerButtonsStyle, 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.
  • overlayVisibilityThresholdMs on BlazeVideosPlayerStyle, 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

  • widgetId is now optional on all row and grid widgets - a unique value is generated when it is omitted.
  • widgetRemoteIdentifier on 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 extending BlazeWidgetController with reloadAllTabs(), reloadNonActiveTabs(), reloadTab(index:) and reloadTabByContainerId(containerId:) for the fullscreen widget-to-tabs player. reloadTab and reloadTabByContainerId are iOS only.
  • activeTabIndicator on BlazePlayerTabsStyle, through the new BlazePlayerActiveTabIndicatorStyle (isVisible, height), drawing an underline beneath the selected tab. Opt-in; the indicator color and width always follow the selected tab title.
  • isTabVisibleWhenEmpty on BlazePlayerTabsStyle, to keep or auto-remove a Moments Tabs tab whose content is empty or fails to load. The first tab is always kept.
  • isTabTitleVisibleWhenSingleTab on BlazePlayerTabsStyle - see Breaking changes.

SDK configuration and privacy

  • forceLayoutDirection on BlazeSDK.initSDK(), with the new BlazeLayoutDirection enum (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, and BlazeSDK.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() and deleteValue(). setContext() clears every existing key first, so prefer setValue() / deleteValue() for incremental updates.

Ads

  • extraInfo (BlazeContentExtraInfo) on BlazeGAMBannerAdsDelegateOnAdEventParams, on the new BlazeGAMBannerAdsDelegateOnAdErrorParams, and on BlazeGAMCustomNativeAdsDelegateOnAdEventParams, carrying contextual metadata about the content surrounding the ad.
  • adInfo on BlazeIMADelegateOnAdEventParams, through the new BlazeIMAAdInfo type (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.