Official Flutter packages for Stream Chat
Quick Links
This repository contains code for our Dart and Flutter chat clients.
Stream allows developers to rapidly deploy scalable feeds and chat messaging with an industry leading 99.999% uptime SLA guarantee.
Sample apps and demos
Our team maintains a dedicated repository for fully-fledged sample applications and demos. Consider checking out GetStream/flutter-samples to learn more or get started by looking at our latest Stream Chat demo .
Free for Makers
Stream is free for most side and hobby projects. To qualify your project/company needs to have < 5 team members and < $10k in monthly revenue. For complete pricing details visit our Chat Pricing Page
Structure
Stream Chat Dart is a monorepo built using Melos . Individual packages can be found in the packages directory while configuration and top level commands can be found in melos.yaml.
To get started, run bootstrap after cloning the project.
melos bootstrap
Packages
We provide a variety of packages depending on the level of customization you want to achieve.
A pure Dart package that can be used on any Dart project. It provides a low-level client to access the Stream Chat service.
This package provides a persistence client for fetching and saving chat data locally. Stream Chat Persistence uses Moor as a disk cache.
This package provides business logic to fetch common things required for integrating Stream Chat into your application. The core package allows more customisation and hence provides business logic but no UI components.
This library includes both a low-level chat SDK and a set of reusable and customizable UI components.
This library includes a set of localization files for the Flutter UI components.
Flutter Chat Tutorial
The best place to start is the Flutter Chat Tutorial . It teaches you how to use this SDK and also shows how to make frequently required changes.
Example Apps
Every package folder includes a fully functional example with setup instructions.
We also provide a set of sample apps created using the Stream Flutter SDK at this location .
Download Stream Chat app source code on GitHub
Flutter Chat SDK – Build your own chat app experience using Dart, Flutter and the Stream Chat Messaging API. https://github.com/GetStream/stream-chat-flutter 389 forks. 1,057 stars. 27 open issues. Recent commits: fix(ui): match preview prefixes, reply icons and list text colors to the design (#3102)* fix(ui): style the preview prefixes in channel and thread lists like the designThe "You:" and sender name prefix is now semibold in each list's mutedcolor (tertiary in the channel list, secondary in the thread list), andthe "Draft:" prefix is semibold instead of bold.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): size quoted reply preview icons like the designA quoted reply now shows its preview icons at 12 pixels instead of 16. Themessage preview theme gains `iconSize` and `iconColor`, so apps can changeboth; icons still match the text beside them unless `iconColor` is set.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): show "No messages yet" in the tertiary text colorThe default channel list item showed it in the secondary color of the rest ofthe subtitle instead of the muted tertiary one the design uses.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): show the thread list root message in the primary text colorThe root message had no color of its own, so it took the app's default textcolor instead of the primary one the design uses.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* chore: Update Goldens* docs(ui): say how the preview icon color resolves and split its tests`deletedContentStyle` now says a set `iconColor` wins for its icon. The iconsize and color tests check one behavior each, and the channel list no longerpins the unchanged 16-pixel default.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): show "No messages yet" in ChannelLastMessageText in the tertiary text colorIt now defaults to the tertiary color like the channel list's own subtitle, anda color set in its `textStyle` still wins.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* Revert "fix(ui): show "No messages yet" in ChannelLastMessageText in the tertiary text color"This reverts commit 24e0bf4cda57c48fcac37aea605d4da8ec45128b.* fix(ui): size the composer's reply and edit preview icons like the designThe composer header's reply and edit previews now show their icons at 12pixels, like a quoted reply in the message list. The sender prefix and iconsize docs say where their defaults change, and the changelog covers everypreview the semibold prefix applies to.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>———Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> , GitHub fix(ui): align quoted replies and message previews with the design (#3098)* fix(ui): style deleted quotes and preview icons like the text around them"Message deleted" inside a quoted reply now keeps the reply's text colorinstead of the muted list color, and inline preview icons now share thecolor of the text beside them.The deleted and "Draft:" label styles move out of the formatter into a newStreamMessagePreviewTheme, set app-wide throughStreamChatThemeData.messagePreviewTheme or per reply throughStreamQuotedMessageThemeData.previewStyle. Also drops an unused mentionshelper from the formatter.Fixes FLU-652.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): title a quote of your own message "You"The reply card inside a sent message now titles a quote of the currentuser's message "You", like the composer's reply preview and the channellist already do, instead of the user's full name.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* refactor(ui): name the preview theme after StreamMessagePreviewTextRenames StreamMessagePreviewTheme to StreamMessagePreviewTextTheme andStreamChatThemeData.messagePreviewTheme to messagePreviewTextTheme, afterthe widget they style. Adds senderTextStyle for the "You:" / "Ann:"prefix, the last part of a preview the formatter styled on its own.A deleted quote now always takes the quote's subtitle color unlessStreamQuotedMessageThemeData.previewStyle sets one, so an app-widedeleted color no longer reaches quoted replies. Documents howpreviewStyle applies on top of subtitleTextStyle.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* docs(ui): state the preview theme defaults and tidy its testsEach StreamMessagePreviewTextThemeData field now says what it defaults to,long doc lines are rewrapped, and the deleted-preview test is split soeach test checks one behavior.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* refactor(ui): name the preview styles by where they sit in a previewThe "Draft:" and sender styles become draftPrefixStyle andsenderPrefixStyle, and the deleted one becomes deletedMessageStyle, sinceit stands in for the message rather than leading it.StreamQuotedMessageThemeData.previewStyle becomes messagePreviewTextTheme,matching StreamChatThemeData, and sits next to subtitleTextStyle.Tightens the preview theme and formatter docs to the contract, andcorrects formatGroupMessage's fallback, which goes to formatDirectMessage.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* refactor(ui): let each screen choose how a deleted preview looksA deleted message now matches the rest of its preview by default. Thechannel list, thread list and message search keep it in the tertiary textcolor through their own defaults, and a quoted reply keeps its reply colorwith no special case. StreamChannelListItemThemeData andStreamThreadListTileThemeData gain messagePreviewTextTheme to change it.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): show a deleted thread list preview in the secondary text colorMatches the design, where a thread list mutes a deleted message one stepbelow its primary text. Adds a test that an app-wide deleted style reachesthe channel list, and notes that a standalone StreamMessagePreviewText nolonger mutes a deleted message on its own.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* refactor(ui): resolve preview styles the way Flutter's own widgets doStreamMessagePreviewTextTheme.of now returns the nearest theme, or theapp-wide one, like ChipTheme.of. Each screen resolves every preview styleas its own value, then the outer theme, then its default, and a themedstyle replaces the default rather than blending into it.Also documents which preview theme wins on each screen and tidies thequoted message and message search resolution.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* refactor(ui): name the deleted preview style after the content it replacesThe "Message deleted" text stands in for a message's content, so its styleis now deletedContentStyle, next to the draft and sender prefix styles.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): keep a preview's design defaults when an app sets one propertyA themed preview style now layers onto the screen's default, so settingonly italic on deleted messages keeps the list's muted color, and acolor-only sender or draft style keeps its bold. Same shape as TabBar,which layers the picked label style onto its defaults.Also notes which prefixes each screen shows, and that preview icons nolonger follow a surrounding IconTheme.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* refactor(ui): resolve preview themes the way the rest of the SDK doesStreamMessagePreviewTextTheme.of now layers a local theme over theapp-wide one, like the SDK's other themes, so wrapping a subtree to changeone style keeps the app-wide values for the rest. Each screen resolves itspreview theme in two lines: its defaults with the outer theme on top, thenits own field on top of that.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* fix(ui): keep app-wide thread list styles under a local theme`StreamThreadListTileTheme.of` returned a local theme on its own, so anythingit left unset, such as an app-wide `messagePreviewTextTheme`, fell back to thedefault. It now merges the local theme over the app-wide one, like the otherthemes.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* docs(ui): tighten the message preview theme docs and cover their precedenceCorrects the quoted reply and deleted-message docs, says once that a set stylekeeps the default for anything it leaves out, and moves the `IconTheme`change to the changelog's Changed section. Adds tests for which preview themewins on each screen, a local preview theme, and the message search tile.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* docs(ui): correct the preview theme docs and sharpen their testsNames the quoted reply's subtitle colors, says where a deleted message ismuted by default, recommends instead of instructs, links each component'spreview theme and folds the changelog's two Changed sections into one. Testscheck one behavior each, assert painted colors, use realistic fixtures andcover the theme data itself.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>———Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> , GitHub feat(ui): add a next action to poll options and skip confirming empty ones (#3100)* feat(ui): add a next action to poll options and skip confirming empty onesThe poll creator's option fields now show a next action on thekeyboard. It moves to the next option, or from the last one adds a newoption, or closes the keyboard when no option can be added. Removing anempty option no longer asks for confirmation, and focus moves to theprevious option so the keyboard stays up.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* chore: Update Goldens* test(ui): check focus lands on the previous option after a removalThe test typed into whichever option was focused, so it also passed iffocus went to the first option instead. It now checks the first optionis left unchanged.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>———Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> , GitHub fix(ui): hide the poll option controls when there is only one option (#3099)* fix(ui): hide the poll option controls when there is only one optionThe poll creator showed the reorder handle and remove button on a loneoption, where neither applies. They now appear only once there are twoor more options, and a single option can no longer be lifted to drag.Points stream_core_flutter at GetStream/stream-core-flutter#202, so theremaining option keeps receiving typed text when its controls go away.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* chore: Update Goldens* test(ui): cover the poll creator sheet with several optionsThe default sheet golden now shows a single option without its reorderhandle and remove button, so add one with several options to keep thefull layout covered.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>* chore: Update Goldens* chore(ui): point stream_core_flutter at the merged text input fixGetStream/stream-core-flutter#202 is merged, so pin its merge commit onmain instead of the PR branch.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>———Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> , GitHub docs(repo): link both the chat and core Figma files (#3104)Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> , GitHub
Provides the list of the opensource Flutter apps collection with GitHub repository.