NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3103 most downloaded on pub.dev
The Official UI package for Stream Video, a service for building video calls, audio rooms, and live-streaming applications.
Last release 22 days ago
16 Sep 2026
Ships on a steady schedule
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
73 releases · first in 2023
chore(repo): video smoke test skill by @Brazol in #1316
Full Changelog: v1.5.0...v1.6.0
One column per quarter.
EncryptionManager with Call.setE2EEManager prior to joining, or by specifying encryption at call creation using StreamEncryptionSettings. Supported on Android, iOS, and macOS. For implementation details and examples, refer to the encryption guide.CallPreferences.encryptionKeyResolver, which supplies the key for calls your app does not join itself, such as those answered from a ringing notification. See the documentation for details.ActionCallIncomingFailed and IncomingCallFailureReason to notify when the system blocks showing an incoming call (e.g. due to Do Not Disturb or block list). Listen via onRingingEvent<ActionCallIncomingFailed>.AndroidPushConfiguration(telecom: TelecomPushConfiguration(...)).dart_webrtc to 1.8.2, required for WebAssembly builds.phoneCall foreground service, which Android 17's background audio hardening requires for audio played while no activity is visible.consumeIncomingCall could create multiple Call instances for the same ringing flow, causing state conflicts and UI issues.chore(repo): add update_goldens workflow by @renefloor in #1304
Full Changelog: v1.4.3...v1.5.0
stopTrackOnMute parameter to ToggleMicrophoneOption, passed through to Call.setMicrophoneEnabled. Set it to false to keep the audio track alive on mute — required on iOS/macOS for speaking-while-muted detection.CallState.isWebAudioPlaybackBlocked, which reports whether the browser's autoplay policy is blocking playback of remote audio. Observe it through call.state to show a "tap to enable sound" affordance the moment playback is blocked. Always false on every other platform.RtcMediaDeviceNotifier.resumeWebAudioPlayback(), which retries playback of the blocked remote audio elements. Call it from within a user gesture (e.g. a button tap) so the browser allows playback. A no-op on every other platform. Unrelated to the existing resumeAudioPlayout(), which unmutes playout paused via pauseAudioPlayout().SpeakingWhileMutedRecognition) now works on iOS, macOS and web (previously Android-only). On iOS/macOS it requires muting with stopTrackOnMute: false. Check the cookbook for details and per-platform requirements.stopTrackOnMute parameter to Call.setMicrophoneEnabled. The default (true, unchanged) stops and releases the audio track on mute; false keeps the track alive and sends silence instead. See the documentation for the trade-offs.RtcRemoteTrack.setSinkId is now asynchronous (Future<RtcRemoteTrack> instead of RtcRemoteTrack) and throws when the browser cannot route the track to the requested device.RtcRemoteTrack.stop takes an optional disposeWebAudioPlayer flag (defaults to true, no effect on native). Pass false when the track may resume on the same transceiver, to keep its <audio> element and the selected output device.autoplay attribute and failing with no indication.Call.setAudioOutputDevice reporting success when the browser rejected the device or did not support output selection at all.Call.setAudioOutputDevice leaving playback split across two output devices when one remote track rejected the switch. The switch is now attempted for every remote audio track, the tracks that accept it are updated, and the selection is only rejected when every track rejected the device.RtcRemoteTrack.copyWith dropping the transceiver, so a remote track lost it as soon as a copy was made — which on web happens every time an audio output device is applied to the track.Call.setAudioBitrateProfile unmuting already-muted participants. Muted tracks now stay muted and update constraints on next unmute.Call.suspendAudio() resume unintentionally unmuting users who muted while audio was suspended. Resume now preserves mute state.ci(repo): add automated pub.dev publishing pipeline by @xsahil03x in #1294
Full Changelog: v1.4.2...v1.4.3
(trackType, publishOptionId) before creating the sender, so a concurrent one reuses that sender instead of adding a second, and a repeated enable joins the media acquisition already in flight rather than opening the camera twice.mid after a renegotiation or publish retry. It's now resolved from the current peer-connection state so the SFU can reliably match the track to its media.FormatException when sending requests if the application name (or other device/app info) contains non-ASCII characters. Values included in the X-Stream-Client header are now sanitized to valid header characters.feat(samples): Update chat sdk in dogfooding by @renefloor in #1253
Full Changelog: v1.4.1...v1.4.2
VideoFit.adaptive, which picks between cover and contain based on the video's own orientation: landscape/square video fills the tile while portrait/tall video is letterboxed so the whole frame stays visible.Call.state.audioOutputDevice now stays in sync with the active native audio route when the output changes outside of Call.setAudioOutputDevice (e.g. via the native route-selection UI, or when the system re-routes on device connect/disconnect).ClientEventReporter).VideoFit.adaptive on web and desktop (so portrait feeds such as phone cameras are shown in full instead of being cropped) and VideoFit.cover on mobile. Set videoFit explicitly on StreamCallParticipantThemeData (or the renderer widgets) to override.chore(deps): bump the all-actions group across 1 directory with 3 updates by @dependabot [bot] in #1259
Full Changelog: v1.4.0...v1.4.1
X-Stream-Client header and SFU ClientDetails being sent with stale or incomplete device/app info.TransparentActivity is recreated with a null intent action (e.g. after process death or restore from recents) (#1256).TransparentActivity when the activity is recreated with a null intent action (e.g. after process death or restore from recents) (#1256).fix(llc): deprecate precacheGenericSdps instead of removing it by @Brazol in #1242
Full Changelog: v1.3.3...v1.4.0
Each call now owns an isolated native PeerConnectionFactory. This fixes cross-call audio interference, sibling-call microphone capture loss, and noise cancellation failing to engage during lobby preview.
Call.ensureNativeFactory(), which returns the per-call native NativePeerConnectionFactory. Use it to pin pre-join media (e.g. lobby-preview tracks created via RtcLocalTrack.camera(nativeFactory: …)) to the same factory the call uses after joining.audioConfigurationPolicy override on DefaultCallPreferences. It falls back to StreamVideoOptions.audioConfigurationPolicy when null.degradationPreference for video quality, falling back to maintain-framerate when it is unspecified.new state).dropIfAloneInRingingFlow (the remote party hung up first). Call.end() and Call.leave() now share a single _disconnect cleanup path.Call._clear multi-call aware. The audio processor is owned by StreamVideo rather than by an individual Call, so disabling it during one call's teardown silently dropped noise cancellation on any other still-active call. _clear now stops the global processor only when no other active call is configured to use NoiseCancellationSettingsMode.autoOn.double.AudioDeviceModule. Previously, all calls shared the global ambient factory. This per-call isolation is what enables clean multi-call audio. Integrators building tracks directly should pass nativeFactory: await call.ensureNativeFactory() to the RtcLocalTrack.* constructors.feat(llc): high scale livestream publisher hint added by @Brazol in #1219
Full Changelog: v1.3.2...v1.3.3
TranscriptionSettingsResponse.fromJson crashing with a null check error when the backend returns an empty string for the language field.isPinned: true on a ParticipantJoined event, the participant is now automatically pinned.hintHighScaleLivestreamPublisher parameter to Call.join() to allow marking the participant as publishing to a large audience.chore(llc): openAPI models regen by @Brazol in #1209
Full Changelog: v1.3.1...v1.3.2
consumeAndAcceptActiveCall auto-accepting incoming calls on Android when the user opens the app without pressing the Accept button on the notification. The method now only consumes calls that the user explicitly accepted.CallDiagnosticsContent throwing failed to call super.dispose when the widget was disposed while awaiting stats subscription cancellation.StreamHlsSettings.qualityTracks (List<String>) is deprecated — use StreamHlsSettings.qualities (List<StreamVideoQuality>) instead.PartialCallStateBuilder for reactive state updates instead of one-shot call.state.value reads.fix(llc): fixed ringing race conditions by @Brazol in #1185
Full Changelog: v1.3.0...v1.3.1
Call.join when another connect is already in progress, with proper timeout handling.consumeAndAcceptActiveCall to ensure the coordinator WS is connected before consuming incoming calls during cold start.feat(llc): hifi stereo playout (Android and iOS) by @Brazol in #1173
Full Changelog: v1.2.4...v1.3.0
VideoModerationConfig in CallPreferences. Check cookbook for more details.SfuAudioBitrateProfile to select an audio quality profile before joining a call:
SfuAudioBitrateProfile.voiceStandard – Standard voice (64 kbps, default)SfuAudioBitrateProfile.voiceHighQuality – High-quality voice (128 kbps)SfuAudioBitrateProfile.musicHighQuality – HiFi music mode (128 kbps, audio processing disabled)audioConfigurationPolicy in StreamVideoOptions. Includes predefined policies:
AudioConfigurationPolicy.broadcaster() – Mono playout with voice processing enabled (default)AudioConfigurationPolicy.viewer() – Stereo playout with voice processing disabled, ideal for passive listenersAudioConfigurationPolicy.hiFi() – Stereo capture and playout with voice processing disabled, ideal for hosts streaming high-fidelity audioAudioConfigurationPolicy.custom() – Full control over platform-specific audio settings with optional basePolicy fallbackRtcMediaDeviceNotifier.reinitializeAudioConfiguration() to switch audio configuration policy at runtime (must be called before starting a call).See the documentation for details.
androidAudioConfiguration in StreamVideoOptions. Use audioConfigurationPolicy instead.iceRestart event — the client now correctly performs ICE restart and renegotiation when instructed by the SFU, improving fast reconnect reliability.dropIfAloneInRingingFlow is set to true in CallPreferences the call will now end when the last participant leaves the call.fix(llc): fix call connection issues on web by @Brazol in #1171
Full Changelog: v1.2.3...v1.2.4
chore(repo): fixes required for pana by @Brazol in #1152
Full Changelog: v1.2.2...v1.2.3
call.leave() performanceincludesCallsInRecents to iOS push configuration to control whether CallKit calls appear in Recents.reconnectReason to reconnect details for sfu logs.[Android] Fixed WebSocket/WebRTC connections persisting after app is killed from recents. Foreground services now properly terminate and leave calls w
Added default sorting preset for Picture-in-Picture mode to prioritize the most relevant participant.
startScreenSharingNotificationService now returns a boolean indicating success/failure, preventing screen share attempts when the service fails to start.[Android] Added support for screen audio sharing. To enable it set captureScreenAudio to true in ScreenShareConstraints. See documentation for more de
captureScreenAudio to true in ScreenShareConstraints. See documentation for more details.Added pipTrackPriority parameter to PictureInPictureConfiguration to control whether screen sharing or camera track is preferred in PiP mode. When set
pipTrackPriority parameter to PictureInPictureConfiguration to control whether screen sharing or camera track is preferred in PiP mode. When set to camera, the camera track is preferred, but screen share will still be shown as a fallback if the camera is disabled.LivestreamPlayer and LivestreamContent.
showMultipleHosts, layoutMode, screenShareMode.livestreamHostsParticipantBuilder and livestreamHostsParticipantsFilter to customize how hosts are selected and rendered.videoFit parameter in LivestreamPlayer to control contain/cover behavior when not in fullscreen.LivestreamPlayer/LivestreamContent: added livestreamFastReconnectingOverlayBuilder to customize the UI shown during fast reconnect.LivestreamContent: livestreamNotConnectedBuilder provides isMigrating/isReconnecting flags to tailor messaging when not connected.StreamCallContent: added callFastReconnectingOverlayBuilder to render a custom overlay while fast reconnecting.StreamCallContent: callNotConnectedBuilder now exposes CallNotConnectedProperties with isMigrating/isReconnecting to customize the not-connected/reconnecting view.call.join() performance - reduced join time by optimizing WebRTC setup and deferring non-critical operations.Fixed incoming call timeout handling.
🐞 Fixed
streamVideo.observeCoreRingingEventsForBackground() instead of streamVideo.observeCallDeclinedRingingEvent() in firebaseMessagingBackgroundHandler to support all necessary events.New builder methods have been introduced to accommodate this change, and some previous builder methods are now deprecated.
call.setCameraTargetResolution() method.pictureInPictureConfiguration parameter. For platform-specific setup, refer to the documentation.joinBehaviour parameter, allowing control over whether and when the LivestreamPlayer automatically connects the user to a call.showRecordingsWhenEnded parameter to LivestreamPlayer, which enables you to show or hide the recordings list in the default livestream ended UI.LivestreamPlayer to leverage call.partialState for more efficient state management. New builder methods have been introduced to accommodate this change, and some previous builder methods are now deprecated.This release removes the dependency on flutter_callkit_incoming, resulting in several breaking changes to CallKit and ringing functionality:
This release removes the dependency on flutter_callkit_incoming, resulting in several breaking changes to CallKit and ringing functionality:
pushParams parameter in StreamVideoPushNotificationManager with the new pushConfiguration field (StreamVideoPushConfiguration).nameCaller parameter has been standardized and renamed to callerName across all relevant locations.callerCustomizationCallback and backgroundVoipCallHandler have been fully removed from StreamVideoPushNotificationManager.appName field in pushParams has been removed as it was deprecated. On iOS, the app’s product name from build settings is now used instead.onCallKitEvent is now onRingingEventobserveCoreCallKitEvents is now observeCoreRingingEventsobserveCallAcceptCallKitEvent is now observeCallAcceptRingingEventobserveCallDeclinedCallKitEvent is now observeCallDeclinedRingingEventobserveCallEndedCallKitEvent is now observeCallEndedRingingEventCallKitEvent type is now RingingEventstream_video_filters. To use video filters, add the package to your pubspec.yaml and update your relevant imports.StreamVideo.muteVideoWhenInBackground → StreamVideo.options.muteVideoWhenInBackgroundStreamVideo.muteAudioWhenInBackground → StreamVideo.options.muteAudioWhenInBackgroundStreamCallType() constructor → StreamCallType.defaultType()Call.setParticipantPinned() → Call.setParticipantPinnedLocally() (local-only pin)startRtmpBroadcasts parameter from Call.goLive()localParticipant parameter from AddReactionOption constructorandroidAudioAttributesUsageType and androidAudioAttributesContentType parameters in RtcMediaDeviceNotifier.handleCallInterruptionCallbacks()[!IMPORTANT]
Flutter's iOS SPM is experimental and disabled by default. You can enable it viaflutter config --enable-swift-package-manager. Flutter will fall back to CocoaPods for plugins that don't support SPM. See the Flutter SPM docs.
Call.ring() to ring specific members of an existing call. Example: call.ring(userIds: ['<userId>'], video: true). Sends a ringing/VoIP push to the users’ devices. Users must already be members - use call.addMembers() first if needed.RtcMediaDeviceNotifier.pauseAudioPlayout() / RtcMediaDeviceNotifier.resumeAudioPlayout() to mute and restore remote playback with platform-specific handling for iOS/macOS and Android.RtcMediaDeviceNotifier.handleCallInterruptionCallbacks().RtcMediaDeviceNotifier.regainAndroidAudioFocus() to request audio focus when it was lost without automatic regain.[Web] Fixed setting input audio/video device passed by CallConnectOptions as well as switching those devices during the call.
🐞 Fixed
CallConnectOptions as well as switching those devices during the call.callMembers collection wasn't reflecting the actual members list after starting the call session.✅ Added
checkIfAudioOutputChangeSupported() to the Call class to check whether the browser supports changing the audio output device.The byParticipantSource participant sorting now accepts a list of sources. The default sorting for speaker and livestream presets now include other in
🔄 Changed
byParticipantSource participant sorting now accepts a list of sources. The default sorting for speaker and livestream presets now include other ingress sources.> Important: This release includes breaking changes for Android development.
🚧 Build breaking changes
Important: This release includes breaking changes for Android development.
Android Requirements:
- Minimum compileSDK 36
- Android Gradle Plugin >=8.12.1
- Gradle wrapper >=8.13
- Kotlin 2.2.0
🚧 Breaking changes
Call.stats payload structure changed
({ CallStats publisherStats, CallStats subscriberStats })({ PeerConnectionStatsBundle publisherStatsBundle, PeerConnectionStatsBundle subscriberStatsBundle })Stats-related fields removed from CallState
publisherStats, subscriberStats, latencyHistory
call.stats streamcall.statsReporter?.currentMetricsDependency updates
✅ Added
call.statsReporter property provides access to currentMetricscall.statsReporter?.currentMetrics🔄 Changed
Call.stats record field names and types updated as noted in breaking changes section🐞 Fixed
Extended CallParticipantState with participantSource. This indicates the participant's source channel (e.g., WebRTC, RTMP, WHIP) and can be used in fi
✅ Added
CallParticipantState with participantSource. This indicates the participant's source channel (e.g., WebRTC, RTMP, WHIP) and can be used in filtering and sorting criteria.SfuClientCapability.subscriberVideoPause (on by default). Control via Call.enableClientCapabilities() / Call.disableClientCapabilities().SfuInboundStateNotificationEvent notifies when inbound tracks are paused or resumed.CallParticipantState.pausedTracks and CallParticipantState.isTrackPaused() let you check which tracks are currently paused.call.kickUser(). Requires the kick-user permission.🐞 Fixed
Handled SFU stats reporting failures gracefully
🐞 Fixed
✅ Added
StreamVideo instance by providing androidAudioConfiguration to StreamVideoOptions.Deprecated callRejoinTimeout in RetryConfig, instead added networkAvailabilityTimeout to CallPreferences to control how long the SDK waits for network…
✅ Added
reconnectTimeout option in CallPreferences, allowing you to set the maximum duration the SDK will attempt to reconnect to a call before giving up.🔄 Changed
callRejoinTimeout in RetryConfig, instead added networkAvailabilityTimeout to CallPreferences to control how long the SDK waits for network connectivity to be restored during reconnection attempts before timing out.🔄 Dependency updates
flutter_callkit_incoming dependency to version 2.5.7. That version contains Android 14 compatibility fixes for ringing notifications and lock screen handling.🐞 Fixed
DtlsSrtpKeyAgreement audio constraint parameter mapping(iOS) Fixed Picture-in-Picture (PiP) issue where remote participants joining during active PiP mode would not have their video tracks displayed proper
🐞 Fixed
✅ Added
display_name custom data to the call. See the documentation for details.🚧 (Android) Picture-in-Picture (PiP) Improvements - Breaking Change
🚧 (Android) Picture-in-Picture (PiP) Improvements - Breaking Change
StreamFlutterActivity - extend it instead of FlutterActivity for automatic PiP support.MainActivity, remove the manual onUserLeaveHint() implementation and extend the MainActivity with StreamFlutterActivity. Previously required manually calling PictureInPictureHelper.enterPictureInPictureIfInCall(this) - now handled automatically.setPictureInPictureEnabled method from StreamVideoFlutterPlatform, StreamVideoFlutterBackground, and MethodChannelStreamVideoFlutter classes, and the deprecated enterPictureInPictureIfInCall method from PictureInPictureHelper (Android). PiP is now handled automatically by StreamPictureInPictureAndroidView.🔄 Partial State Updates:
For a more detailed explanation check the dedicated documentation.
call.partialState for more specific and efficient state updates.StreamCallContainer, StreamCallContent, StreamIncomingCallContent, and others that no longer return a state.
By (only) using these callbacks the root widgets will use more efficient partial state updates.PartialCallStateBuilder to help with making widgets that depend on partialState.✅ Added
setMirrorVideo method to Call class to control video mirroring for participants.maxParticipantsExcludeOwner and maxParticipantsExcludeRoles to Call limits settings, providing finer control over participant limits by allowing exclusion of call owners and specific roles from the maximum count.🐞 Fixed
Added handleCallInterruptionCallbacks method to RtcMediaDeviceNotifier that provides an option to handle system audio interruption like incoming calls
✅ Added
handleCallInterruptionCallbacks method to RtcMediaDeviceNotifier that provides an option to handle system audio interruption like incoming calls, or other media playing. See the documentation for details.sort in PictureInPictureConfiguration that enables customization of PiP participant selection.🐞 Fixed
Introduced extendBody parameter in StreamCallContent that extends the participants view to the bottom edge of the scaffold when enabled.
✅ Added
extendBody parameter in StreamCallContent that extends the participants view to the bottom edge of the scaffold when enabled.allowMultipleActiveCalls option in StreamVideoOptions enabling support for concurrent active calls. See the documentation for details.🐞 Fixed
Resolved an issue where the screen share track would disappear when zoomed in.
🐞 Fixed
ScreenShareCallParticipantsContent with Spotlight view on very wide windows.✅ Added
LivestreamPlayer for enhanced customization:
videoRendererBuilder: Build a custom video renderer.videoPlaceholderBuilder: Build a placeholder for the video renderer.livestreamHostsUnavailableBuilder: Customize the UI when a livestream is connected but no hosts have video enabled.livestreamNotConnectedBuilder: Customize the UI when the livestream is not connected.Introduced callDurationStream to the Call class. A Stream that emits the current call duration.
✅ Added
callDurationStream to the Call class. A Stream<Duration> that emits the current call duration.createdByUser property to the CallState for better tracking of the initiating user.livestreamControlsBuilder parameter to LivestreamPlayer allowing customisation of controls panel.🐞 Fixed
Fixed issue with the user feedback collection endpoint.
🐞 Fixed
✅ Added
ring, audio, video, screenshare, session and frameRecordings settings to Call.getOrCreate() method.members list parameter to Call.getOrCreate() method to allow assigning roles when creating a call.session and frameRecordings settings to Call.update() method.🔄 Updated
LivestreamPlayer widget with a refreshed look and feel. Added livestreamEndedBuilder and livestreamBackstageBuilder for enhanced configuration options.Introduced camera focus and zoom control features:
✅ Added
Call.setZoom() method to adjust the camera’s zoom level.Call.focus() method for setting focus and exposure points on the camera.🐞 Fixed
Introducing noise cancellation support to enhance call audio quality. Implement this feature easily by following our documentation.
✅ Added
networkMonitorSettings to StreamVideoOptions for configuring network monitoring, including customization of test URLs for connection checks.🚧 (Breaking Changes)
onCallDisconnected callback in StreamCallContainer to include a CallDisconnectedProperties parameter with detailed disconnection reason information.setScreenShareEnabled method in CallSession class to return the screen sharing track.callPreferences property from CallStateNotifier to CallState for better state management.🐞 Fixed
CallPreferences could be ignored when accepting a ringing call.battery_plus plugin on older Android devices.Deprecated the setParticipantPinned() method in the Call class — use setParticipantPinnedLocally() instead.
🐞 Fixed
🔄 Changed
device_info_plus dependency to support a wider range of versions and resolve potential conflicts.setParticipantPinned() method in the Call class — use setParticipantPinnedLocally() instead.isPinned parameter in CallParticipantState with a pin object, which now differentiates between local and remote pinning.✅ Added
membersLimit parameter in the getOrCreate() and join() methods of the Call class to limit the number of members included in the response.setParticipantPinnedForEveryone(), allowing users with the required permissions to pin participants for all. The setParticipantPinned() method has been replaced with setParticipantPinnedLocally(), which, as before, only pins participants locally.🔄 Changed
Introduced CallParticipantState.audioLevels, which stores the last 10 audio levels of a participant.
✅ Added
CallParticipantState.audioLevels, which stores the last 10 audio levels of a participant.CallState.activeSpeakers to retrieve a list of currently active speakers.observeCoreCallKitEvents() in StreamVideo with a new CallPreferences? preferences parameter, allowing for configuration of the accepted call.🐞 Fixed
Added CallPreferences? preferences parameter to consumeIncomingCall() method in StreamVideo to make it possible to configure the consumed call.
✅ Added
CallPreferences? preferences parameter to consumeIncomingCall() method in StreamVideo to make it possible to configure the consumed call.🐞 Fixed
thermal package throwing exception on Android 9 and lower.Introduced the onCallDisconnected callback in StreamCallContainer, enabling customization of the default behavior, which invokes Navigator.pop upon ca
✅ Added
onCallDisconnected callback in StreamCallContainer, enabling customization of the default behavior, which invokes Navigator.pop upon call disconnection.registerDevice() and unregisterDevice() methods publicly available in PushNotificationManager.❗ Breaking Change: ignoreLocalParticipantVideo parameter in IOSPictureInPictureConfiguration is replaced by includeLocalParticipantVideo. By default,…
flutterfire_cli for push notifications you might need to reactivate it by running: dart pub global activate flutterfire_cli.✅ Added
disposeAfterResolvingRinging() and consumeAndAcceptActiveCall() methods in StreamVideo to simplify the ringing flow implementation.
🔄 Changed
backgroundVoipCallHandler parameter in StreamVideoPushNotificationManager, as it is no longer required for iOS ringing to function in a terminated state.🐞 Fixed
StreamLobbyVideo to support more screen sizes.stream_webrtc_flutter package.🚧 (Breaking) Picture-in-Picture (PiP) Improvements & Fixes
disablePictureInPictureWhenScreenSharing configuration option to PictureInPictureConfiguration. When true (default), PiP is disabled if the local device is screen sharing.ignoreLocalParticipantVideo parameter in IOSPictureInPictureConfiguration is replaced by includeLocalParticipantVideo. By default, local video is enabled and will appear in PiP mode if the iOS device supports Multitasking Camera Access.ignoreLocalParticipantVideo parameter in StreamPictureInPictureUiKitView is also replaced by includeLocalParticipantVideo.Deprecated the handleVoipPushNotification() method in the StreamVideo class. Use handleRingingFlowNotifications() instead.
🐞 Fixed
battery_plus and thermal packages were erroneously called on web. #837🔄 Changed
handleVoipPushNotification() method in the StreamVideo class. Use handleRingingFlowNotifications() instead.Resolved an issue where media tracks were not being disabled or enabled correctly. #828
The package is now compatible with Gradle 8. The minimum required Java version is now 17. #820
🚧 Breaking changes
flutter_callkit_incoming package to version 2.5.0, which also requires Java 17. #820resolution parameter of Call.setPreferredIncomingVideoResolution() method changed type from VideoResolution to VideoDimension.Call.onPermissionRequest callback changed the event type passed as an argument from CoordinatorCallPermissionRequestEvent to StreamCallPermissionRequestEvent✅ Added
Call.closedCaptions stream to overlay captions during your call.CallPreferences to configure:
closedCaptionsVisibilityDurationMs for controlling how long captions are displayed.closedCaptionsVisibleCaptions for managing the number of captions in the display queue.ToggleClosedCaptionsOption widget.🐞 Fixed
Updated minimum Flutter version to 3.24.5
✅ Added
call.collectUserFeedback() method which allows users to send call quality rating. These ratings are visible on the Dashboard and are aggregated in call stats for easy tracking. For a sample implementation, please refer to the documentation.StreamVideoPushNotificationManager.ensureFullScreenIntentPermission() method. This resolves an issue on some Android 14 devices where full-screen notifications would not appear due to missing permissions.
You can now invoke this method to show a settings screen, allowing users to enable the required permission if it's not already enabled.🐞 Fixed
Most updates are within the internals of the Call class, though some changes are outward-facing, including a few breaking changes.
This release introduces a major rework of the join/reconnect flow in the Call class to support Reconnect V2, enhancing reconnection handling across various scenarios. Most updates are within the internals of the Call class, though some changes are outward-facing, including a few breaking changes.
🔄 Changed
Call.reject() method will now always call Call.leave() method internally.🚧 Breaking changes
Call.joinLobby() method.maxDuration and maxParticipants parameters of Call.getOrCreate() are now combined into the StreamLimitsSettings? limits parameter.🔄 Dependency updates
✅ Added
registerPushDevice optional parameter (default is true) to the StreamVideo.connect() method,allowing the prevention of automatic push token registration.participantCount and anonymousParticipantCount to CallState reflecting the current number of participants in the call.watch parameter to Call.get() and Call.getOrCreate() methods (default is true). When set to true, this enables the Call to listen for coordinator events and update its state accordingly, even before the call is joined (Call.join()).targetResolution setting set on the Dashboard to determine the max resolution the video stream.Call.setPreferredIncomingVideoResolution() allows you to manually set a preferred video resolution, while Call.setIncomingVideoEnabled() enables or disables incoming video. For more details, refer to the documentation.🐞 Fixed
StreamVideo now stores registered token in SharedPreferences, performing an API call only when the token changes.dropIfAloneInRingingFlow is set to true.Migrated from internet_connection_checker to internet_connection_checker_plus due to license issues.
🐞 Fixed
internet_connection_checker to internet_connection_checker_plus due to license issues.callAppBarBuilder in StreamCallContent can now return null in order to hide the app bar.backgroundColor field in StreamCallControls is now correctly applied.Fixed an issue where active call foreground service was recreated after being stopped when ringing call was declined and in-app incoming screen was di
🐞 Fixed
🚧 Breaking changes
The regular push notification handling has been removed from iOS, providing more control over the implementation. VoIP push notifications will continue to be handled as before. For more details, refer to the documentation.
Dependency updates
Improved video quality for a smoother experience.
🐞 Fixed
Fixed CallKit integration on iOS when app is in a terminated state. It now correctly openes the app when the call is accepted.
🐞 Fixed
onLeaveCallTap callback in StreamCallContent. It's now correctly handled.🔄 Changed
SortParam changed to SortParamRequest in queryMembers() method inside Call and StreamVideo classAdded backstage parameter to call.getOtCreate() method with backstage settings. For more information, refer to the documentation
✅ Added
backstage parameter to call.getOtCreate() method with backstage settings. For more information, refer to the documentation
joinAheadTimeSeconds parameter (part of StreamBackstageSettings)startsAt parameter to call.getOtCreate() methodmaxDuration and maxParticipants parameters to call.getOtCreate() methodvideo parameter to call.getOtCreate(), call.getCall() and call.join() methods. This parameter is used to distinguish between audio-only and video calls for ringing purposes.
video parameter is false by default. If you want your call to be treated as a video call while ringing set it to true.streamVideo paramter to StreamLobbyView and StreamLobbyVideo widgets provide a custom StreamVideo instance.🐞 Fixed
CallPreferences).Previously deprecated String type parameters in makeCall() and getCallRingingState() methods are now removed. Use StreamCallType callType parameter no…
✅ Added
🐞 Fixed
🚧 Breaking changes
BroadcastSampleHandler, used for broadcast screen-sharing mode on iOS is now moved from stream_video_flutter package to a separate stream_video_screen_sharing package.
Migration steps:stream_video_screen_sharing dependency to your pubspec.yaml fileSampleHandler.swift file from stream_video_flutter to stream_video_screen_sharingPodfile file from stream_video_flutter to stream_video_screen_sharingFor complete screen-sharing guide please refer to the documentaiton
String type parameters in makeCall() and getCallRingingState() methods are now removed. Use StreamCallType callType parameter now.events and coordinatorEvents streams are now removed from Call class. Use callEvents instead.The default constructor for StreamCallType is now deprecated. Instead, use the StreamCallType.defaultType() factory constuctor.
✅ Added
watch parameter to StreamVideo.queryCalls() method, allowing you to subscribe to queried call events. For more information, refer to the documentation.listRecordings() to StreamVideo object, enabling you to query call recordings using a provided call CID.🔄 Changed
StreamCallType is now deprecated. Instead, use the StreamCallType.defaultType() factory constuctor.🐞 Fixed
ScreenSharingConstraints to adjust the quality.FloatingViewAlignment enum is now properly exported in the stream_video_flutter package.Fixed compilation errors on web.
🐞 Fixed
✅ Added
CallMissedEvent event will be sent now when the user misses the call.startTranscription(), stopTranscription() and listTranscriptions() methods to Call class.takeScreenshot() method to Call class.recordingExternalStorage optional param to call.startRecording() method.requestScreenSharePermission() method to Call class that ensures correct permissions are given for screen-sharing on Android.🔄 Changed
role member to roles, to reflect the possibility of the user having multiple roles, in CallParticipantState and CallMember.SortParamRequest to SortParam.🔄 Changed some of the signatures
listRecordings() method in PermissionsManager doesn't require sessionId param now.setParticipantPinned() method in Call and CallSession now requires sessionId, userId, and pinned params instead of SetParticipantPinned action.updateViewportVisibility() method in CallSession now requires visibilityChange param instead of UpdateViewportVisibility action.setSubscriptions() and updateSubscription() methods in CallSession now require a list of subscriptionChanges param instead of a list of SetSubscription actions.reason param to reject() method in Call class.Removed
updateSubscriptions method from Call.Added ClientDetails to SFU's join request.
✅ Added
ClientDetails to SFU's join request.🐞 Fixed
Bumped connectivity_plus dependency to 6.0.3
🚧 Build breaking changes
connectivity_plus dependency to 6.0.3Note, that this changes the plugin requirements:
- compileSDK 34 for Android part
- Java 17 for Android part
- Gradle 8.4 for Android part
🐞 Fixed
Updated minimum supported dart SDK version to 3.3.0 (which requires min Flutter SDK 3.19.0)
🚧 Breaking changes
Updated minimum supported dart SDK version to 3.3.0 (which requires min Flutter SDK 3.19.0)
Updated flutter_webrtc to 0.10.4
🐞 Fixed
Reverted flutter_webrtc dependency version back to 0.9.47 to fix the compilation issues for web in Flutter 3.19.
flutter_webrtc dependency version back to 0.9.47 to fix the compilation issues for web in Flutter 3.19.Fixed application of initial call configuration (via CallConnectOptions) and default settings from Stream Dashboard
🐞 Fixed
CallConnectOptions) and default settings from Stream Dashboard✅ Added
audioOutputDevice, audioInputDevice and cameraFacingMode added to CallConnectOptionsconnectOptions parameter added to call.join() method as a preferred way of setting initial call configuration - check out our documentation for more infoUpdated minimum supported SDK version to Flutter 3.16
✅ Added
mirrorMode parameter to CameraConstraints, which determines whether the camera for the given track should be mirrored or not. When set as defaultMode the mirroring is set as true, when facingMode is set to user and false when facingMode is set to environment.🐞 Fixed
Added callEvents stream to Call that replaces events and coordinatorEvents streams (both are now deprecated).
✅ Added
callEvents stream to Call that replaces events and coordinatorEvents streams (both are now deprecated).callBackgroundBuilder to StreamOutg/oingCallContent.🚧 Breaking changes
callCid parameter requirement from sendCustomEvent() method in Call class.🐞 Fixed
Added keepConnectionsAliveWhenInBackground to StreamVideoOptions to allow keeping websocket connections and event subscribtions open when app is in th
✅ Added
keepConnectionsAliveWhenInBackground to StreamVideoOptions to allow keeping websocket connections and event subscribtions open when app is in the background (false by default).🐞 Fixed
LobbyView where camera/microphone state selected would not be correctly applied into the callYour coding agent can read these notes before it upgrades. Set up the MCP server →