NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1055 most downloaded on pub.dev
The official Dart client for Stream Chat, a service for building chat applications.
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 58 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
7 years old
253 releases · first in 2020
One column per quarter.
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
✅ Added
StreamChatClient.recoverStateOnReconnect, which was previously write-only.ChannelClientState.isMarkedAsUnread, which reports whether the current user marked the channel unread and hasn't read past that point since.🔄 Changed
🐞 Fixed
CurrentPlatform throwing UnimplementedError on WebAssembly builds.location.expired events for the same expired location.AttachmentFile.extension returning the whole file name when the file has no extension.UploadConfig.sizeLimit being 0 when no size limit is set in the Stream Dashboard; it now falls back to UploadConfig.defaultSizeLimit.StreamChatClient.getAppSettings() result.🔄 Internal / Non-breaking
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
✅ Added
Event.channelMemberCount, exposing the server-provided channel_member_count field on channel events (e.g. member.added, member.removed, member.updated).🔄 Changed
Channel.translateMessage now merges the translated message into the channel state, so the translation reaches anything watching the channel without the caller applying the response itself.^3.12.0.Channel and ClientState streams that expose a single primitive value are now distinct, so they only emit when the value actually changes. Affects Channel.memberCountStream, messageCountStream, watcherCountStream, cooldownStream, nameStream, imageStream, frozenStream, disabledStream, hiddenStream, isPinnedStream, isArchivedStream, createdAtStream, updatedAtStream, deletedAtStream, truncatedAtStream, lastMessageAtStream, and ClientState.totalUnreadCountStream, unreadChannelsStream, unreadThreadsStream.🐞 Fixed
Channel.memberCount / memberCountStream staying stale for the rest of the session after members joined or left; channel events now apply the server-provided member count, the same way messageCount already did.connection.recovered still fires. #2910PlatformDispatcher.onError report as a fatal crash. #2921⚠️ Deprecated
StreamChatClient.unflagMessage and StreamChatClient.unflagUser. The /moderation/unflag endpoint is no longer supported by the server and the calls have no effect; both methods will be removed in a future major release.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
StreamChatClient.isLocalUnreadCountEnabled (default false). When enabled, channels that have read events disabled (e.g. livestream channel types) track their unread count locally, on-device: incoming messages increment it, hard-deleted messages decrement it, and Channel.markRead / markUnread / markUnreadByTimestamp update it locally without a network request — including Read.lastReadMessageId, so the unread divider and jump-to-unread button anchor to the right message. Channels that support read receipts are unaffected and keep relying on server-driven unread counts.Event.watcherCount, exposing the server-provided watcher_count field on events (e.g. user.watching.start, user.watching.stop, message.new).StreamChatNetworkError.type (a StreamChatNetworkErrorType capturing the transport failure kind — connection error, timeout, cancellation, etc.).FilterOperator alongside Filter.⚠️ Deprecated
StreamChatNetworkError.isRequestCancelledError in favor of type == StreamChatNetworkErrorType.cancel.🔄 Changed
dio version to ^5.11.0.🐞 Fixed
pinned_at descending.last_message_at descending.StreamWebSocketError.toString() using a WebSocketError(...) prefix instead of the class name; it now also includes code, and StreamChatNetworkError.toString() now surfaces the transport type when known.ChannelClientState.watcherCount staying stale during a session.ChannelClientState.watchers on user.watching.stop.Channel.name/image/extraData setters throwing after a failed initialization; they now only throw once the channel is successfully initialized.Channel.initialized staying errored after a failed init; it now reflects a subsequent successful (re)initialization.StateError (Cannot add new events after calling close) thrown when the client is disposed while a reconnect recovery is still in flight.StreamChatClient.sync letting a failure from its final updateLastSyncAt write escape to the caller; it is now handled by the method's own error handling, like every other sync failure.Message.deleteMyReaction dropping an entire reaction group when its summed scores reached zero even though other users' reactions kept the count positive; the group is now retained as long as its count stays above zero.reaction_counts/reaction_scores payloads being discarded at parse time when their score total was zero or negative despite a positive count.Channel.getReplies adding the parent message to ChannelClientState.threads when a backend returns it alongside the replies, which rendered the thread root twice. The online path now filters it out, matching the offline one.last_updated.ChannelClientState no longer handling notification.mark_read (regression since 9.20.0), which left unreadCount stale after Channel.markRead on channels the user isn't watching.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
✅ Added
upsert flag to ChannelClientState.updateMessage (defaults to true). Pass false to update a message only if it's already loaded in the state, skipping unknown messages instead of adding them.EventType.userPresenceChanged (user.presence.changed) constant.🔄 Changed
participantLimit and memberLimit on ThreadOptions from 100 to 10.StreamChatClient.updateSystemEnvironment now sanitizes the passed SystemEnvironment: sdkName, sdkVersion, and osName are locked to internal defaults, and sdkIdentifier only accepts the dart → flutter promotion (other values, including a flutter → dart demotion, are ignored). appName, appVersion, osVersion, and deviceModel continue to pass through as-is.🐞 Fixed
StreamChatNetworkError.fromDioException no longer throws FormatException when an edge/proxy returns a non-JSON body (e.g. a plain upstream request timeout from a 504); the original network error now surfaces with statusCode / statusMessage intact.ComparableField now folds diacritics/ligatures and ignores case when comparing strings, so SortOption on fields like name no longer pushes lowercase or non-ASCII names (jhon, Łukasz, Øystein) to the end of client-sorted lists (#2601).message.updated and soft message.deleted events being incorrectly upserted into ChannelState.messages (and thread reply lists) when they targeted a message outside the currently loaded window.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
✅ Added
StreamChatClient: searchRoles for searching roles.StreamChatClient: listUserGroups, searchUserGroups, getUserGroup, createUserGroup, updateUserGroup, deleteUserGroup, addUserGroupMembers, removeUserGroupMembers.Message: mentionedChannel, mentionedHere, mentionedRoles, mentionedGroupIds, and mentionedGroups.ChannelCapability.notifyChannel, notifyHere, notifyRole, and notifyGroup capabilities, with matching Channel.canNotifyChannel / canNotifyHere / canNotifyRole / canNotifyGroup getters.ChannelConfig.pushLevel, pushNotifications, and chatPreferences for per-channel-type push configuration.PushLevel and ChatPreferenceLevel extension types and the ChatPreferences model — granular per-category push preferences (direct, channel, here, role, group mentions, thread replies, default).chatPreferences field to PushPreferenceInput, PushPreference, and ChannelPushPreference.Command.set field and CommandSet extension type (fun, moderation) for typed access to the backend's command set classifier.StreamChatClient.pauseReconnect / resumeReconnect to suspend the WebSocket's auto-retry loop without tearing down the user session.🔄 Changed
Command constructor: description and args are now optional (default to ''), matching the backend's "always present, may be empty" wire shape.🐞 Fixed
Message.toJson mention sanitization (removeMentionsIfNotIncluded) now requires @token to match at a word boundary, so e.g. typing @administrator no longer keeps a stale admin role mention alive, and @channels / @hereafter no longer keep mentionedChannel / mentionedHere set.WebSocketChannelException surfacing when a reconnect attempt failed (e.g. DNS lookup failed in background); the duplicate signal on sink.done is now ignored since the stream's onError already handles it.message.read events delivered for threads.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
✅ Added
StreamChatClient.appSettings and StreamChatClient.getAppSettings() to read and refresh the per-app upload configuration set in the Stream Dashboard.AppSettings model with fileUploadConfig / imageUploadConfig (both UploadConfig) — exposes sizeLimit, allowedFileExtensions, blockedFileExtensions, allowedMimeTypes, and blockedMimeTypes.StreamChatClient.recoverStateOnReconnect (defaults to true); when false, the client no longer auto-re-queries active channels on connection recovery — useful for consumers driving their own refresh from the connectionRecovered event.Message.updateWith(Message? other) — merges a server-side update onto the local message while preserving locally-known poll, sharedLocation, ownReactions, and nested quotedMessage enrichment when the server omits them.Channel.isOneToOne — true when the channel is isDistinct and has exactly two members. For the looser count-only check, inline channel.memberCount == 2.IterableMergeX.merge (keyed-map merge on Iterable<T>, unsorted output) and SortedListX.mergeSorted (two-pointer merge on a sorted List<T>). Splits what SortedListX.merge did in 9.24.0 — see Changed below.QueryChannels on StreamChatClient (StreamChatClient.queryChannels and StreamChatClient.queryChannelsWithResult).ChatPersistenceClient.queryChannelStates and ChatPersistenceClient.saveChannelQueries as the unified read/write methods for channel-query persistence. Both accept standard and predefined-filter parameters and internally dispatch.⚠️ Deprecated
Message.syncWith in favor of Message.updateWith. Note the arguments are flipped: local.updateWith(remote) replaces remote.syncWith(local).ChatPersistenceClient.getChannelStates and ChatPersistenceClient.updateChannelQueries in favor of the unified queryChannelStates / saveChannelQueries. The deprecated methods stay overridable so downstream subclasses keep working unchanged.🔄 Changed
async, collection, dio, equatable, http_parser, json_annotation, logging, synchronized, uuid, web_socket_channel) to current resolved versions.^3.11.0.Channel.isGroup from memberCount != 2 to memberCount > 2 || !isDistinct. Two-member non-distinct channels now correctly report as groups, and 1-member distinct channels no longer do. Migrate via !channel.isOneToOne or channel.memberCount != 2.Channel.isDistinct to require the !members- prefix (with trailing dash), matching the backend's DistinctChannelPrefix constant. Real server-generated ids always include the dash; only malformed/test ids that previously matched the looser !members check are affected.SortedListX.merge (added in 9.24.0) → SortedListX.mergeSorted and moved the unsorted/iterable variant to IterableMergeX.merge. Callers on List<T> that want sorted output should switch to mergeSorted; callers on Iterable<T> keep using merge.ClientState (channels, users, activeLiveLocations) unmodifiable. Direct mutation used to silently bypass their streams; update them via addChannels / removeChannel, updateUser / updateUsers.ClientState (channels=, currentUser=, activeLiveLocations=, totalUnreadCount=, blockedUserIds=, updateUsers, updateUser, addChannels, removeChannel) as @internal. App flows (connectUser, etc.) are unaffected.🔒 Security
jose floor to 0.3.5+1 to address CVE-2026-34240 (untrusted JWK header accepted during signature verification). The SDK only uses JsonWebToken.unverified and is not directly exploitable, but the floor bump ensures consumers resolve to a patched version.🐞 Fixed
Channel.getRemainingCooldown() and currentUserLastMessageAt now scan thread replies in addition to main-channel messages, matching the backend behaviour where both message types share the same per-channel cooldown bucket.lastSyncAt to the current time instead of replaying every event since lastSyncAt through handleEvent. client.sync() remains available for consumers that need event-level replay.Channel.sendMessage / Channel.updateMessage hanging forever when any attachment upload failed; they now throw StreamChatError.quoted_message payload during channel re-sync.message.updated events no longer clobber locally-known poll / sharedLocation on the parent.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.Fixed Location.endAt field not being properly converted to UTC, causing "expected date" API errors when sending location messages.
🐞 Fixed
Fixed Location.endAt field not being properly converted to UTC, causing "expected date" API
errors when sending location messages.
Included the changes from version 9.20.0.
Added support for user.messages.deleted event.
✅ Added
Added support for user.messages.deleted event.
Included the changes from version 9.19.0.
Changed `MessageState` factory constructors: The deleting, deleted, and deletingFailed factory constructors now accept a MessageDeleteScope parameter
🛑️ Breaking
MessageState factory constructors: The deleting, deleted, and deletingFailed
factory constructors now accept a MessageDeleteScope parameter instead of bool hard.
Pattern matching callbacks also receive MessageDeleteScope scope instead of bool hard.AttachmentFileUploader: The AttachmentFileUploader interface
now includes four new abstract methods (uploadImage, uploadFile, removeImage, removeFile).
Custom implementations must implement these methods.For more details, please refer to the migration guide.
✅ Added
Added support for deleting messages only for the current user:
Channel.deleteMessageForMe() - Delete a message only for the current userStreamChatClient.deleteMessageForMe() - Delete a message only for the current user via clientMessageDeleteScope - New sealed class to represent deletion scopeMessageState.deletingForMe, MessageState.deletedForMe, MessageState.deletingForMeFailed statesMessage.deletedOnlyForMe, Event.deletedForMe, Member.deletedMessages model fieldsAdded standalone file and image upload/removal methods for CDN operations:
StreamChatClient.uploadImage() - Upload an image to the Stream CDNStreamChatClient.uploadFile() - Upload a file to the Stream CDNStreamChatClient.removeImage() - Remove an image from the Stream CDNStreamChatClient.removeFile() - Remove a file from the Stream CDNIncluded the changes from version 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.Changed `sendReaction` method signature: The sendReaction method on both Client and Channel now accepts a full Reaction object instead of individual p
🛑️ Breaking
sendReaction method signature: The sendReaction method on both Client and
Channel now accepts a full Reaction object instead of individual parameters (type, score,
extraData). This change provides more flexibility and better type safety.✅ Added
Added comprehensive location sharing support with static and live location features:
Channel.sendStaticLocation() - Send a static location message to the channelChannel.startLiveLocationSharing() - Start sharing live location with automatic updatesChannel.activeLiveLocations - Track members active live location shares in the channelClient.activeLiveLocations - Access current user active live location shares across channelslocationShared, locationUpdated, and locationExpired eventsIncluded the changes from version 9.15.0.
Deprecated API Cleanup: Removed all deprecated classes, methods, and properties for the v10 major release:
🛑️ Breaking
Deprecated API Cleanup: Removed all deprecated classes, methods, and properties for the v10 major release:
PermissionType (use string constants like 'delete-channel', 'update-channel'), CallApi, CallPayload, CallTokenPayload, CreateCallPayloadcooldownStartedAt getter from Channel, getCallToken and createCall from StreamChatClientreactionCounts and reactionScores getters from Message (use reactionGroups instead), call property from StreamChatApipermission_type.dart, call_api.dart, call_payload.dart and their associated testsIncluded the changes from version 9.14.0.
Included the changes from version `9.13.0`.
9.13.0.- Bug fixes and improvements
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
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
🔒 Security
jose floor to 0.3.5+1 to address CVE-2026-34240
(untrusted JWK header accepted during signature verification). The SDK only uses JsonWebToken.unverified and
is not directly exploitable, but the floor bump ensures consumers resolve to a patched version.🐞 Fixed
Fixed Channel.getMessagesById mutating the loaded channel window as a side effect of fetching.
Fixed StreamChatClient.queryDrafts not forwarding the filter argument to the API.
Coalesced concurrent queryChannels calls with identical parameters via an in-flight cache.
Rapid reconnect bursts no longer fire multiple duplicate requests in parallel.
✅ Added
Added SortedListX and ListX extensions on List for keyed merge, sorted insert/upsert and
conditional update.
Added ChannelClientState.pruneOldest(int) that drops the oldest messages and keeps at most the
requested number. No-op when the channel isn't up to date. Prefer StreamChannel.pruneOldest
from stream_chat_flutter_core when available — it also resets top-pagination.
Added StreamChatClient.recoverStateOnReconnect setter (default true). Controls whether the
client re-queries active channels on WebSocket reconnect. Set to false if your app handles its
own state recovery — e.g. via channel-list controllers.
🚀 Performance
Faster channel state updates, especially for read receipts, reactions, and other partial-state events that don't touch the messages list. Reactions targeted at thread messages no longer scan the channel-level message list.
Channel.readStream, Channel.currentUserReadStream, and Channel.unreadCountStream now dedupe
consecutive equal values via .distinct(). Previously all three were derived from
channelStateStream without deduplication, so every channel state mutation (new message, reaction,
edit, member change, etc.) would push through to subscribers — causing UI listeners that only
cared about read state to rebuild on unrelated events.
🔄 Changed
Channel.currentUserReadStream now emits null when the user logs out (previously the
transition was swallowed).
Removed proactive re-fetching of messages with expired CDN attachment URLs on every channel state update. URL refreshes now flow through normal server events.
Minor bug fixes and improvements
Added support for filterTags in channels.
✅ Added
filterTags in channels.Channel.markUnreadByTimestamp and Client.markChannelUnreadByTimestamp
methods to mark all messages after a given timestamp as unread.hideHistoryBefore in Channel.addMembers and Client.addChannelMembers to
specify a timestamp before which channel history should be hidden for newly added members. When
provided, it takes precedence over the hideHistory boolean flag.Fixed user's ID from being inadvertently used as their display name during the WebSocket connection process. [[#2447]]
🐞 Fixed
Deprecated Channel.canSendTypingEvents in favor of Channel.canUseTypingEvents.
✅ Added
OwnUser.privacySettings.invisible field to User and OwnUser models.lastDeliveredAt and lastDeliveredMessageId fields
in Read model.Client.markChannelsDelivered method to submit delivery receipts.deliveriesOf and readsOf helper methods to ReadIterableExtension for querying read and
delivery statuses.Channel.canUseDeliveryReceipts, Channel.canUseReadReceipts,
Channel.canUseTypingEvents.⚠️ Deprecated
Channel.canSendTypingEvents in favor of Channel.canUseTypingEvents.🔄 Changed
markRead, markUnread, markThreadRead, and markThreadUnread methods now throw
StreamChatError when channel lacks required capabilities.Minor bug fixes and improvements
Improved sync reliability and error handling with enhanced lastSyncAt initialization, 400 error recovery, and automatic flushing of stale persistence
🐞 Fixed
lastSyncAt initialization, 400
error recovery, and automatic flushing of stale persistence data after 30 days of inactivity.✅ Added
Message.channelRole field to provide access to the sender's channel role.Channel.messageCount field.ChannelState.pendingMessages or ChannelState.pendingMessagesStream.🐞 Fixed
ChannelState.memberCount, ChannelState.config and ChannelState.extraData getting reset
on first load.Fixed currentUser.pushPreferences not updating immediately after calling setPushPreferences.
🐞 Fixed
currentUser.pushPreferences not updating immediately after calling setPushPreferences.Channel.sendMessage to prevent sending empty messages when all attachments are cancelled
during upload.toDraftMessage to only include successfully uploaded attachments in draft messages.Fixed skipPush and skipEnrichUrl not preserving during message send or update retry
🐞 Fixed
skipPush and skipEnrichUrl not preserving during message send or update retryChannel methods to throw proper StateError exceptions instead of relying on assertions
for state validation.OwnUser specific fields getting lost when creating a new OwnUser instance from
an User instance.Client.currentUser specific fields getting reset on user.updated events.✅ Added
Client.setPushPreferences which allows setting PushPreferences for the
current user or for a specific channel.Added avgResponseTime field to the User model to track average response time in seconds.
✅ Added
avgResponseTime field to the User model to track average response time in seconds.skipPush while updating a channel message, which allows you to update a
message without sending a push notification.🐞 Fixed
WebSocket race condition where reconnection could access null user during disconnect.Deprecated SortOption.new constructor in favor of SortOption.desc and SortOption.asc.
🐞 Fixed
✅ Added
client.getUnreadCount(), which returns the unread count information for the
current user.🔄 Changed
SortOption.new constructor in favor of SortOption.desc and SortOption.asc.- Bug fixes and improvements
Added support for MessageReminder feature, which allows users to bookmark or set reminders for specific messages in a channel.
✅ Added
MessageReminder feature, which allows users to bookmark or set reminders
for specific messages in a channel.Deprecated message.reactionCounts, message.reactionScores in favor of message.reactionGroups.
✅ Added
reactionGroups to the Message model. This field is a map of reaction types to their
respective counts and scores and additional metadata such as the first and last reaction
timestamps.🔄 Changed
message.reactionCounts, message.reactionScores in favor of
message.reactionGroups.🐞 Fixed
Null check operator used on a null value in Websocket connect.[[#2013]](https://github.com/GetStream/stream-chat-flutter/issues/2013) Fix pinned message get duplicated.
🐞 Fixed
🔄 Changed
freezed_annotation dependency to ">=2.4.1 <4.0.0".Added teams role support for users.
✅ Added
client.queryThreads method.Added support for Channel pinning and archiving.
✅ Added
Client and Channel class to manage draft messages:
channel.createDraft: Saves a draft message for a specific channel.channel.getDraft: Retrieves a draft message for a specific channel.channel.deleteDraft: Deletes a draft message for a specific channel.client.queryDrafts: Queries draft messages created by the current user.🐞 Fixed
channelState.unreadCount not updating if the user is not part of the read list.🔄 Changed
Channel class to properly update unread state information.Deprecated PermissionType in favor of ChannelCapability.
✅ Added
Added new helper extensions on Channel to provide a convenient way to check if the current user
has specific capabilities in a channel.
final canSendMessage = channel.canSendMessage;
final canSendReaction = channel.canSendReaction;
Added support for message moderation feature.
Improved user blocking functionality by updating client state when blocking/unblocking users:
client.blockUser now updates currentUser.blockedUserIds list with newly blocked user IDs.client.unblockUser now removes the unblocked user ID from currentUser.blockedUserIds list.client.queryBlockedUsers now updates currentUser.blockedUserIds with the latest blocked users data.🐞 Fixed
Channel.membership
field not updating correctly.🔄 Changed
PermissionType in favor of ChannelCapability.[[#1775]](https://github.com/GetStream/stream-chat-flutter/issues/1775) Fix incorrect message order.
🐞 Fixed
[[#2101]](https://github.com/GetStream/stream-chat-flutter/issues/2101) Added support for system messages not updating channel.lastMessageAt.
✅ Added
channel.lastMessageAt.member.extraData field.🐞 Fixed
🔄 Changed
Attachment.uploadState logic for local and remote attachments. Also updated the logic for determining the attachment type to check for ogScrapeUrl instead of AttachmentType.giphy.x-stream-client header generation for better client identification and analytics.Updated minimum Flutter version to 3.27.4 for the SDK.
🔄 Changed
Added support for overriding the baseUrl of the websocket.
✅ Added
Added support for overriding the baseUrl of the websocket.
final client = StreamChatClient(
apiKey,
logLevel: Level.INFO,
baseWsUrl: 'http://localhost:8080',
);
- Bug fixes and improvements
Added support for Threads v2 feature, which allows users to query all the threads.
✅ Added
Added support for Polls feature, which allows users to create and vote on polls in chat messages.
✅ Added
🔄 Changed
Nothing published for this version
Added support for AI assistant states and events.
✅ Added
Added user blocking to the client.
✅ Added
Added httpClientAdapter to StreamHttpClient that enables the use native http implementations
✅ Added
httpClientAdapter to StreamHttpClient that enables the use native http implementations🔄 Changed
Fixed incorrect user object and online presence when user is updated.
🐞 Fixed
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →