NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1066 most downloaded on pub.dev
Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter.
Last release 8 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
6 years old
139 releases · first in 2021
chore(ui): deprecate AI assistant components moved to stream_chat_flutter_ai by @renefloor in #2988
channel.dart into focused files by @VelikovPetar in #2930StreamChannelPage by @VelikovPetar in #2916Full Changelog: v10.4.0...v10.5.0
One column per quarter.
✅ Added
StreamChannel.openAtFirstUnread; set it to false to open a channel at the latest message instead of the first unread.chore(llc): deprecate StreamChatClient.unflagMessage and unflagUser by @VelikovPetar in #2923
StreamChatClient.unflagMessage and unflagUser by @VelikovPetar in #2923ready future on connect by @xsahil03x in #2927Full Changelog: v10.3.0...v10.4.0
🔄 Changed
>=3.44.0 and Dart SDK to ^3.12.0.chore(samples): migrate from flutter_app_badger to app_badge_plus by @xsahil03x in #2836
onReactionPicked by @w830207 in #2823StreamBackButton unread count by @VelikovPetar in #2816pinned_at and last_message_at channel sorts by @VelikovPetar in #2878last_updated sort by @VelikovPetar in #2880Full Changelog: v10.2.0...v10.3.0
✅ Added
StreamChannelState.retry() to re-run a failed channel initialization, for use as the retry action in StreamChannel.errorBuilder.DefaultStreamChannelBuilders, an inherited widget that supplies default loading and error builders to descendant StreamChannels (resolved via loadingBuilderOf/errorBuilderOf).search(), searchWithFilter(), and clearResults() to StreamMessageSearchListController, StreamUserListController, and StreamMemberListController. search()/searchWithFilter() debounce reloads by the search-text length (a filter with no search text reloads immediately) and drop superseded results; clearResults() cancels any pending search and clears the results.🐞 Fixed
StreamChannel's default error state exposing raw error details; it now shows a safe error state (icon, message, and a Try Again button wired to retry()) that adapts to the failure type.StreamChannelListController crashing with a null-check error when its local sort ran over a channel disposed mid-query (e.g. a client disconnect/logout racing an in-flight loadMore); such channels are now sorted last instead.chore(deps): bump actions/checkout from 6 to 7 in the all-actions group by @dependabot [bot] in #2784
StreamChannelListController not handling notificaton.channel_deleted event by @VelikovPetar in #2791X-Stream-Client to prevent customers overriding internal values by @VelikovPetar in #2790shadowed messages not hidden in the channel list by @VelikovPetar in #2787message.updated/message.deleted events by @VelikovPetar in #2794Full Changelog: v10.1.0...v10.2.0
🐞 Fixed
StreamChannelListController not handling notification.channel_deleted event.StreamChannelListController's channel.updated, member.updated, and user.presence.changed/user.updated event handlers to skip the full list re-sort when the event doesn't affect any listed channel.fix(ui): wire onUserAvatarTap on StreamMessageItem by @xsahil03x in #2743
PredefinedFilters on QueryChannels by @VelikovPetar in #2709message.read events delivered for threads by @VelikovPetar in #2780Full Changelog: v10.0.1...v10.1.0
🐛 Fixed
PagedValueNotifier subclasses (StreamChannelListController, StreamUserListController, StreamMemberListController, StreamThreadListController, StreamDraftListController, StreamMessageReminderListController, StreamPollVoteListController, StreamReactionListController, StreamMessageSearchListController): in-flight async loads could write value after dispose() had been called, triggering a notifyListeners() assertion throw in debug mode. A new DisposeAwareValueNotifier mixin guards the value setter and also prevents event subscriptions from being set up post-dispose.✅ Added
DisposeAwareValueNotifier<T> mixin on ValueNotifier<T> that silently drops post-dispose value writes and exposes a disposed getter. Useful for any ValueNotifier subclass with async methods.mentionedChannel, mentionedHere, mentionedRoles, addMentionedRole, mentionedUserGroups, and addMentionedUserGroup to StreamMessageComposerController for composing enhanced mentions.StreamMessageComposerController.setCommand(Command) and activeCommand getter for set-aware command activation and tracking.StreamMessageComposerController.validateCommand(Command) returning a nullable CommandUnavailableReason so callers can gate activation against the composer state.CommandUnavailableReason enum (editing, quotedMessage, other) and CommandValidator typedef.⚠️ Deprecated
set command(String?) on StreamMessageComposerController; use setCommand(Command) or clearCommand() instead.🔄 Changed
StreamMessageComposerController.quotedMessage now auto-clears an active moderation-set command (backend doesn't support activating a moderation command alongside a quoted message).StreamMessageComposerController.editMessage now clears any active command (backend doesn't process commands on edit).StreamMessageComposerController.setCommand now also clears mentionedChannel, mentionedHere, mentionedRoles, and mentionedGroups/mentionedGroupIds (was only clearing mentionedUsers); clearCommand restores them.🐞 Fixed
chore(repo): remove deprecated classes, methods, and properties by @xsahil03x in #2306
attachmentPickerOptionsBuilder by @xsahil03x in #2415SampleAppConfig and modernize UI architechture by @xsahil03x in #2614messageLimit is respected in getChannelStates by @VelikovPetar in #2717master to v10.0.0 (08.06.2026) by @VelikovPetar in #2731Full Changelog: v9.25.0...v10.0.1
🛑️ Breaking
StreamMessageInputController → StreamMessageComposerController.StreamRestorableMessageInputController → StreamRestorableMessageComposerController.StreamMessageComposerController.editingOriginalMessage → messageBeingEdited.StreamMessageComposerController constructor no longer accepts non-initial messages;
use editMessage() to enter edit mode.StreamMessageComposerController.cancelEditMessage() is now a no-op when no edit is active.StreamMessageComposerController.clear() no longer exits edit mode;
use cancelEditMessage() instead.✅ Added
StreamChannelListController.StreamMessageComposerController.isEditing getter.StreamMessageComposerController.clearCommand(); setting command = null is
now an alias for it.StreamMessageComposerController.editMessage() and the command setter are now
re-entrant — repeated calls preserve the original restore snapshot.🔄 Changed
device_info_plus to >=12.4.0 <14.0.0, package_info_plus to >=9.0.1 <11.0.0, and connectivity_plus to >=7.1.1 <8.0.0 so apps can adopt the latest majors. Floors raised to current resolved versions.>=3.41.0 and Dart SDK to ^3.11.0.StreamChatCore now sets client.recoverStateOnReconnect = false on mount; refreshes on connectionRecovered are driven by the list controllers in this package, avoiding a duplicate queryChannels round-trip and the historical event-replay flicker on reactions, polls, and quoted messages.Channel outside any list controller (e.g. a deep link into a single channel screen) should subscribe to client.on(EventType.connectionRecovered) and call channel.watch() themselves to refresh state on reconnect.backgroundKeepAlive from 1 minute to 15 seconds — covers quick app-switches and notification-shade checks while closing cleanly before the server's 35-second read timeout. Still configurable.🐞 Fixed
StreamChatCore disconnecting the WebSocket immediately on background when no onBackgroundEventReceived handler was provided; the keep-alive timer now fires before the connection closes regardless of whether a handler is set.StreamMessageComposerController.cancelEditMessage losing the pre-edit draft when a remote update arrived for the message being edited.Nothing published for this version
feat(repo)!: design refresh by @xsahil03x in #2503
Full Changelog: v10.0.0-beta.12...v10.0.0-beta.13
🛑️ Breaking
Included the changes from version `9.23.0`.
9.23.0.Included the changes from version `9.22.0`.
9.22.0.Included the changes from version `9.21.0`.
9.21.0.Included the changes from version `9.20.0`.
9.20.0.Included the changes from version `9.19.0`.
9.19.0.Included the changes from version `9.18.0`.
9.18.0.Included the changes from version `9.17.0`.
9.17.0.Included the changes from version `9.16.0`.
9.16.0.Included the changes from version `9.15.0`.
9.15.0.Included the changes from version `9.14.0`.
9.14.0.Included the changes from version `9.13.0`.
9.13.0.Updated stream_chat dependency to `10.0.0-beta.1`.
stream_chat dependency to 10.0.0-beta.1.perf(llc): speed up converting models to and from JSON by @xsahil03x in #3001
Full Changelog: v9.30.0...v9.31.0
fix(llc): Fix members removed from a channel keeping their read state in the channel state (v9) by @VelikovPetar in #2967
Full Changelog: v9.29.0...v9.30.0
chore(llc): deprecate StreamChatClient.unflagMessage and unflagUser (v9) by @VelikovPetar in #2924
flutter-version-bump skill for v9 by @VelikovPetar in #2902StreamChatClient.unflagMessage and unflagUser (v9) by @VelikovPetar in #2924ready future, don't let reconnect recovery throw into the root zone by @xsahil03x in #2939Full Changelog: v9.28.0...v9.29.0
fix(ui): enrich link previews for uppercase URL schemes by @xsahil03x in #2844
last_updated sort by @VelikovPetar in #2892pinned_at and last_message_at channel sorts by @VelikovPetar in #2889Full Changelog: v9.27.0...v9.28.0
fix(llc): suppress EquatableMixin deprecation warning in StreamChatError by @VelikovPetar in #2802
PredefinedFilters on QueryChannels(v9) by @VelikovPetar in #2775EquatableMixin deprecation warning in StreamChatError by @VelikovPetar in #2802X-Stream-Client to prevent customers overriding internal values (v9) by @VelikovPetar in #2799StreamChannelListController not handling notification.channel_deleted event (v9). by @VelikovPetar in #2800shadowed messages not hidden in the channel list by @VelikovPetar in #2788message.updated/message.deleted events by @VelikovPetar in #2815Full Changelog: v9.26.0...v9.27.0
chore(ci): run pana and legacy analyze on v9 branch by @renefloor in #2756
UpsertPushPreferencesResponse null values parsing by @VelikovPetar in #2749message.read events delivered for threads [v9] by @VelikovPetar in #2781Full Changelog: v9.25.0...v9.26.0
ci(repo): centralize path/draft gating in a per-workflow gate job by @xsahil03x in #2669
ChatPersistenceClient.getChannelStates() by @VelikovPetar in #2664DateTime as ISO-8601 text in DB to preserve sub-seconds precision by @VelikovPetar in #2694Full Changelog: v9.24.0...v9.25.0
✅ Added
StreamChannel.value — exposes an already-initialized channel without running channel-page
positioning. Use it for sub-route and overlay wraps.StreamStateScope<T> — a generic InheritedWidget that exposes a State to descendants for
O(1) .of(context) lookup. Use it to back static of(BuildContext) accessors instead of
BuildContext.findAncestorStateOfType.🐞 Fixed
StreamChannel.getMessage hitting the network for thread replies and pinned messages
already in local state.MessageListCore reloading the parent channel from its dispose path when running in
thread mode.StreamChannel.reloadChannel merging the latest page on top of the previously loaded
window instead of replacing it. The reload now matches a fresh open of the channel.🚀 Performance
StreamChannel.of and StreamChatCore.of now resolve via StreamStateScope<T> instead of
findAncestorStateOfType, replacing an O(tree-depth) element walk with an O(1) inherited-widget
lookup. Callers and behavior are unchanged.fix(llc): bump jose floor to 0.3.5+1 for CVE-2026-34240 by @xsahil03x in #2658
pana reports by @VelikovPetar in #2656filter param in Client.queryDrafts by @VelikovPetar in #2647SortedListX.merge by @xsahil03x in #2660Full Changelog: v9.23.0...v9.24.0
✅ Added
MessageListCore now accepts maximumMessageLimit and retentionTrimBuffer to cap the loaded
message list. Trim fires on new messages past limit + buffer; top pagination, edits, deletions,
jump-to-message, and threads don't trigger it. Disabled by default.StreamChannel.pruneOldest(int) — delegates to ChannelClientState.pruneOldest and resets
the top-pagination tracker.🔄 Changed
defaultMessageFilter now accepts an optional currentUserId; passing null treats every
message as not-my-message.🚀 Performance
MessageListCore now caches the resolved messagesStream, avoiding subscription churn on
every parent rebuild.MessageListCore now applies its message filter and reversal in a single lazy pass, dropping
two intermediate List<Message> allocations per emission.MessageListCore no longer applies a redundant ListEquality comparator on its
BetterStreamBuilder outputs.🐞 Fixed
MessageListController.paginateData not being cleared when MessageListCore is
disposed or its controller is swapped.BetterStreamBuilder rendering the previous stream's last value for one frame after
the stream changes.BetterStreamBuilder getting stuck on the error state when the next stream event
equals the cached value.BetterStreamBuilder silently swallowing stream errors when no errorBuilder is
provided; errors now route through FlutterError.reportError.StreamChatCore. Rapid network flaps (cellular
handovers, brief drops) now collapse into a single reconnect instead of firing a fresh
connectionRecovered per emission.Updated stream_chat dependency to `9.23.0`.
stream_chat dependency to 9.23.0.Updated stream_chat dependency to `9.22.0`.
stream_chat dependency to 9.22.0.Updated stream_chat dependency to `9.21.0`.
stream_chat dependency to 9.21.0.Fixed race condition where connectUser could be blocked when connectivity monitoring triggers during initial connection. [[#2409]]
🐞 Fixed
connectUser could be blocked when connectivity monitoring triggers
during initial connection. [#2409]Updated stream_chat dependency to `9.19.0`.
stream_chat dependency to 9.19.0.Updated stream_chat dependency to `9.18.0`.
stream_chat dependency to 9.18.0.Updated stream_chat dependency to `9.17.0`.
stream_chat dependency to 9.17.0.Fixed MessageListCore not properly loading and paginating thread replies.
🐞 Fixed
MessageListCore not properly loading and paginating thread replies.✅ Added
StreamChannel.Added StreamChatCore.maybeOf() method for safe context access in async operations.
✅ Added
StreamChatCore.maybeOf() method for safe context access in async operations.StreamChannel.maybeOf() method for safe context access in async operations.🐞 Fixed
MessageListCore.dispose() crash when channel reload fails due to insufficient permissions.MessageListCore.didUpdateWidget().StreamChannel future builder completes after channel
initialization. [#2323]Fixed cached messages are cleared from channels with unread messages when accessed offline. [[#2083]]
🐞 Fixed
Fixed pagination end detection logic to properly determine when the top or bottom of the message list has been reached.
🐞 Fixed
Added StreamMessageReminderListController to manage the list of message reminders.
✅ Added
StreamMessageReminderListController to manage the list of message reminders.Updated stream_chat dependency to `9.11.0`.
stream_chat dependency to 9.11.0.Fixed an issue with StreamChannel where loading channel at lastReadMessageId might fail if the channel exceeds the member threshold. This is now handl
🐞 Fixed
StreamChannel where loading channel at lastReadMessageId might fail
if the channel exceeds the member threshold. This is now handled gracefully by falling back to loading
the channel at the lastRead date.🔄 Changed
freezed_annotation dependency to ">=2.4.1 <4.0.0".Added StreamDraftListController to manage the list of draft messages.
✅ Added
StreamDraftListController to manage the list of draft messages.StreamThreadListController.Added StreamChannelState.getFirstUnreadMessage to get the first unread message in the channel.
✅ Added
StreamChannelState.getFirstUnreadMessage to get the first unread message in the channel.Fixed issue with not being able to use a non-initialized Channel in StreamChannel widget. #2080
🐞 Fixed
Channel in StreamChannel
widget. #2080🔄 Changed
StreamChannel to provide proper background colors in the defaultLoadingBuilder and defaultErrorBuilderMaterial widget wrapping in the build method of StreamChannelStateIncrease range of allowed version device_info_plus.
🔄 Changed
device_info_plus.Simplified the logic for setting and clearing OG attachments by removing the _ogAttachment field and directly working with the attachments list.
🔄 Changed
_ogAttachment field
and directly working with the attachments list.🐞 Fixed
Updated minimum Flutter version to 3.27.4 for the SDK.
Updated stream_chat dependency to `9.3.0`.
stream_chat dependency to 9.3.0.Updated stream_chat dependency to `9.2.0`.
stream_chat dependency to 9.2.0.Added StreamThreadListController to load and paginate list of threads.
✅ Added
StreamThreadListController to load and paginate list of threads.Added StreamPollController to create and manage a poll based on the passed configs.
✅ Added
StreamPollController to create and manage a poll based on the passed configs.StreamPollVoteListController to manage the list of votes for a poll.🔄 Changed
Updated stream_chat dependency to `8.3.0`.
stream_chat dependency to 8.3.0.Updated stream_chat dependency to `8.2.0`.
stream_chat dependency to 8.2.0.Changed minimum Flutter version to 3.22 for the SDK.
🔄 Changed
stream_chat dependency to 8.1.0.Fixed bug causing background events to be sent in foreground.
🐞 Fixed
🔄 Changed
stream_chat dependency to 8.0.0.Nothing published for this version
Nothing published for this version
Nothing published for this version
Changed minimum Flutter version to 3.19 for the SDK.
🔄 Changed
stream_chat dependency to 7.3.0.Your coding agent can read these notes before it upgrades. Set up the MCP server →