{"id":"08a84eeb-5b8f-4daf-b152-45131e2fc0d8","shortId":"8dRDrY","kind":"skill","title":"cometchat-flutter-v6-messages","tagline":"Use when implementing the messages screen with CometChat Flutter UIKit v6. Covers CometChatMessageList, CometChatMessageComposer, CometChatMessageHeader, MessageListBloc, MessageComposerBloc, SliverSpacing, keyboard-aware spacing, rich text toolbar, CometChatTextBubble, CometChat","description":"# CometChat Flutter UIKit — Messages\n\nThe messages screen is composed of three components: `CometChatMessageHeader`, `CometChatMessageList`, and `CometChatMessageComposer`.\n\n## Complete Messages Screen\n\n```dart\nScaffold(\n  resizeToAvoidBottomInset: false, // REQUIRED — composer handles keyboard internally\n  appBar: CometChatMessageHeader(\n    user: user,\n    group: group,\n    onBack: () => Navigator.pop(context),\n  ),\n  body: Column(\n    children: [\n      Expanded(\n        child: CometChatMessageList(\n          user: user,\n          group: group,\n          textFormatters: [\n            CometChatMentionsFormatter(user: user, group: group),\n            MarkdownTextFormatter(),\n            CometChatUrlFormatter(),\n            CometChatPhoneNumberFormatter(),\n            CometChatEmailFormatter(),\n          ],\n        ),\n      ),\n      CometChatMessageComposer(\n        user: user,\n        group: group,\n        textFormatters: [\n          CometChatMentionsFormatter(user: user, group: group),\n          MarkdownTextFormatter(),\n          CometChatUrlFormatter(),\n        ],\n      ),\n    ],\n  ),\n)\n```\n\n## CometChatMessageList\n\nDisplays messages with `SliverAnimatedList`, O(1) lookups, and keyboard-aware spacing.\n\n### Key Props\n\n| Prop | Type | Purpose |\n|------|------|---------|\n| `user` / `group` | `User?` / `Group?` | Target conversation (one required) |\n| `goToMessageId` | `int?` | Jump to specific message on load |\n| `startFromUnreadMessages` | `bool` | Start from unread position |\n| `hideDeletedMessages` | `bool` | Hide deleted message placeholders |\n| `disableReceipts` | `bool` | Hide read/delivered receipts |\n| `disableReactions` | `bool` | Hide reaction bar |\n| `enableSwipeToReply` | `bool` | Swipe gesture for reply |\n| `hideDateSeparator` | `bool` | Hide date headers |\n| `textFormatters` | `List<CometChatTextFormatter>` | Formatters for message text |\n| `onThreadRepliesClick` | `Function(BaseMessage, BuildContext, {template})` | Thread navigation callback |\n\n### MessageListBloc Events\n\n| Event | Purpose |\n|-------|---------|\n| `LoadMessages(conversationWith, conversationType)` | Initial load |\n| `LoadOlderMessages` | Scroll up pagination |\n| `LoadNewerMessages` | Scroll down pagination |\n| `MessageReceived(message)` | Real-time incoming message |\n| `MessageEdited(message)` | Real-time edit |\n| `MessageDeleted(message)` | Real-time delete |\n| `JumpToMessage(messageId)` | Scroll to specific message |\n| `MarkMessageAsRead(message)` | Mark as read |\n| `MarkMessageAsUnread(message)` | Mark as unread |\n\n### MessageListState\n\n```dart\nMessageListState(\n  status: MessageListStatus.loaded,  // initial, loading, loaded, empty, error\n  messages: [...],\n  isLoadingOlder: false,\n  isLoadingNewer: false,\n  hasMoreOlder: true,\n  hasMoreNewer: false,\n  unreadCount: 5,\n  unreadMessageAnchor: message,\n)\n```\n\n## CometChatMessageComposer\n\nRich text input with formatting toolbar, attachments, mentions, and audio recording.\n\n### Key Props\n\n| Prop | Type | Purpose |\n|------|------|---------|\n| `user` / `group` | `User?` / `Group?` | Target conversation |\n| `disableTypingEvents` | `bool` | Stop sending typing indicators |\n| `hideVoiceRecordingButton` | `bool` | Hide audio recorder |\n| `hideSendButton` | `bool` | Hide send button |\n| `hideAttachmentButton` | `bool` | Hide attachment picker |\n| `hideStickersButton` | `bool` | Hide sticker panel |\n| `disableMentions` | `bool` | Disable @mentions |\n| `hideBottomSafeArea` | `bool` | Hide bottom safe area padding |\n| `textFormatters` | `List<CometChatTextFormatter>` | Text formatters |\n\n### Rich Text Formatting\n\nThe composer uses a WYSIWYG system (not the clean architecture module):\n- `RichTextEditingController` — span tracking, markdown rendering, format application\n- `SegmentComposerController` — multi-segment (normal text + code blocks)\n- Toolbar buttons dispatch through `cometchat_message_composer.dart`\n\n### buildWhen Optimization\n\nThe composer uses `buildWhen` to prevent rebuilds during keyboard animation:\n```dart\nBlocConsumer<MessageComposerBloc, MessageComposerState>(\n  buildWhen: (previous, current) =>\n      previous.isEditMode != current.isEditMode ||\n      previous.isReplyMode != current.isReplyMode ||\n      previous.isRecordingMode != current.isRecordingMode,\n  // ...\n)\n```\n\n## CometChatMessageHeader\n\nShows user/group info, typing indicators, and optional call buttons.\n\n```dart\nCometChatMessageHeader(\n  user: user,\n  group: group,\n  onBack: () => Navigator.pop(context),\n  hideVideoCallButton: false,\n  hideVoiceCallButton: false,\n  usersStatusVisibility: true,\n  trailingView: (user, group, ctx) => [\n    IconButton(icon: Icon(Icons.info_outline), onPressed: () { /* ... */ }),\n  ],\n  messageHeaderStyle: CometChatMessageHeaderStyle(\n    backgroundColor: colorPalette.background1,\n  ),\n)\n```\n\n## Keyboard-Aware Spacing\n\n`SliverSpacing` handles keyboard interaction:\n- At bottom: keyboard pushes list up (normal behavior)\n- Scrolled up: list stays still, only composer moves\n- Safe area: only added when keyboard is closed\n\nThis is why `resizeToAvoidBottomInset: false` is mandatory.\n\n## Message Bubbles\n\n| Type | Widget | Key Features |\n|------|--------|--------------|\n| Text | `CometChatTextBubble` | Rich text, links, markdown |\n| Image | `CometChatImageBubble` | Local/network, GIF, HEIC fallback |\n| Video | `CometChatVideoBubble` | Thumbnail, play overlay |\n| Audio | `CometChatAudioBubble` | Waveform, play/pause, duration |\n| File | `CometChatFileBubble` | Type icon, download, size |\n| Deleted | `CometChatDeletedBubble` | \"Message was deleted\" |\n\nAll bubble widgets accept optional `colorPalette`, `spacing`, `typography` params for the hybrid theme caching pattern.\n\n## Sending Messages\n\n```dart\n// Text message\nawait CometChatUIKit.sendTextMessage(\n  TextMessage(\n    text: 'Hello!',\n    receiverUid: user.uid,\n    receiverType: ReceiverTypeConstants.user,\n  ),\n);\n\n// Media message\nawait CometChatUIKit.sendMediaMessage(\n  MediaMessage(\n    file: '/path/to/image.jpg',\n    type: MessageTypeConstants.image,\n    receiverUid: user.uid,\n    receiverType: ReceiverTypeConstants.user,\n  ),\n);\n\n// Custom message\nawait CometChatUIKit.sendCustomMessage(\n  CustomMessage(\n    type: 'location',\n    receiverUid: user.uid,\n    receiverType: ReceiverTypeConstants.user,\n    customData: {'latitude': 37.7749, 'longitude': -122.4194},\n  ),\n);\n```\n\n## Thread Replies\n\n```dart\nCometChatMessageList(\n  onThreadRepliesClick: (message, ctx, {template}) {\n    Navigator.push(context, MaterialPageRoute(\n      builder: (_) => Scaffold(\n        resizeToAvoidBottomInset: false,\n        body: Column(\n          children: [\n            CometChatThreadedHeader(\n              parentMessage: message,\n              loggedInUser: CometChatUIKit.loggedInUser!,\n            ),\n            Expanded(child: CometChatMessageList(\n              user: user, group: group,\n              parentMessageId: message.id,\n            )),\n            CometChatMessageComposer(\n              user: user, group: group,\n              parentMessageId: message.id,\n            ),\n          ],\n        ),\n      ),\n    ));\n  },\n)\n```\n\n## Gotchas\n\n- Forgetting `resizeToAvoidBottomInset: false` causes double keyboard compensation — the most common bug when integrating the messages screen. This applies to thread screens too — any Scaffold containing a `CometChatMessageComposer` must set it to `false`.\n- `textFormatters` should be the same list for both `CometChatMessageList` and `CometChatMessageComposer` to ensure consistent rendering.\n- The rich text system has 3 implementations but only WYSIWYG is active at runtime. Bug fixes go in `rich_text_editing_controller.dart`, not the clean architecture module.\n- `goToMessageId` loads messages around that ID, not from the beginning. The list may not have older messages loaded.\n- Keep mutable `_user`/`_group` copies in your State class and update them from SDK listeners. Passing `widget.user`/`widget.group` directly means stale data after block/kick events.\n- The CometChat SDK has an `Action` class (a `BaseMessage` subclass used in group events like kick/ban/scope-change). It conflicts with Flutter's built-in `Action` widget. If your messages screen uses SDK listener mixins that reference `Action`, use an import alias:\n  ```dart\n  import 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart' as cc;\n  // Then use: cc.Action instead of Action\n  ```\n  This is especially common when mixing `GroupListener` into a messages screen State class.\n\n## Anti-Patterns\n\n```dart\n// ❌ WRONG — missing resizeToAvoidBottomInset\nScaffold(\n  body: Column(children: [\n    Expanded(child: CometChatMessageList(user: user)),\n    CometChatMessageComposer(user: user),\n  ]),\n)\n\n// ❌ WRONG — thread screen with resizeToAvoidBottomInset: true\nScaffold(\n  resizeToAvoidBottomInset: true, // Double compensation!\n  body: Column(children: [\n    CometChatThreadedHeader(parentMessage: message, loggedInUser: user),\n    Expanded(child: CometChatMessageList(user: user, parentMessageId: message.id)),\n    CometChatMessageComposer(user: user, parentMessageId: message.id),\n  ]),\n)\n\n// ✅ CORRECT — both messages and thread screens\nScaffold(\n  resizeToAvoidBottomInset: false,\n  body: Column(children: [\n    Expanded(child: CometChatMessageList(user: user)),\n    CometChatMessageComposer(user: user),\n  ]),\n)\n```\n\n```dart\n// ❌ WRONG — passing immutable widget params to UIKit components\nCometChatMessageList(user: widget.user) // Stale after block/unblock\n\n// ✅ CORRECT — mutable state copy\nlate User? _user = widget.user;\n// Update _user from SDK listeners\nCometChatMessageList(user: _user)\n```\n\n```dart\n// ❌ WRONG — different formatters for list and composer\nCometChatMessageList(textFormatters: [MarkdownTextFormatter()])\nCometChatMessageComposer(textFormatters: []) // Inconsistent rendering\n\n// ✅ CORRECT — same formatters\nfinal formatters = [CometChatMentionsFormatter(user: user), MarkdownTextFormatter()];\nCometChatMessageList(textFormatters: formatters)\nCometChatMessageComposer(textFormatters: formatters)\n```\n\n## Checklist\n\n- [ ] Scaffold has `resizeToAvoidBottomInset: false`\n- [ ] Both list and composer have matching `textFormatters`\n- [ ] Mutable `_user`/`_group` state copies, not `widget.user`/`widget.group`\n- [ ] `onThreadRepliesClick` navigates to thread screen with `parentMessageId`\n- [ ] Thread screen Scaffold also has `resizeToAvoidBottomInset: false` (same rule as messages screen)\n- [ ] SDK listeners update `_user`/`_group` for block/kick/scope changes\n- [ ] Colors from `CometChatThemeHelper`, cached in `didChangeDependencies()`\n- [ ] If using SDK listener mixins with `Action`, import UIKit `as cc` to avoid Flutter name conflict","tags":["cometchat","flutter","messages","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react"],"capabilities":["skill","source-cometchat","skill-cometchat-flutter-v6-messages","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-flutter-v6-messages","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (10,672 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:51.670Z","embedding":null,"createdAt":"2026-05-07T13:05:11.563Z","updatedAt":"2026-05-18T19:04:51.670Z","lastSeenAt":"2026-05-18T19:04:51.670Z","tsv":"'-122.4194':556 '/path/to/image.jpg':534 '1':109 '3':649 '37.7749':554 '5':256 'accept':502 'action':716,735,747,765,969 'activ':655 'ad':448 'alia':751 'also':940 'anim':368 'anti':780 'anti-pattern':779 'appbar':61 'appli':614 'applic':343 'architectur':335,666 'area':317,446 'around':671 'attach':266,301 'audio':269,291,483 'avoid':975 'await':519,530,543 'awar':26,114,423 'backgroundcolor':419 'bar':158 'basemessag':178,719 'begin':677 'behavior':436 'blocconsum':370 'block':351 'block/kick':709 'block/kick/scope':955 'block/unblock':863 'bodi':70,572,787,809,838 'bool':138,144,150,155,160,166,283,289,294,299,304,309,313 'bottom':315,430 'bubbl':461,500 'bug':607,658 'buildcontext':179 'builder':568 'buildwhen':357,362,373 'built':733 'built-in':732 'button':297,353,391 'cach':512,960 'call':390 'callback':183 'caus':600 'cc':759,973 'cc.action':762 'chang':956 'chat':756 'checklist':910 'child':74,581,791,818,842 'children':72,574,789,811,840 'class':694,717,778 'clean':334,665 'close':452 'code':350 'color':957 'colorpalett':504 'colorpalette.background1':420 'column':71,573,788,810,839 'cometchat':2,13,32,33,712,755 'cometchat-flutter-v6-messages':1 'cometchat_message_composer.dart':356 'cometchataudiobubbl':484 'cometchatdeletedbubbl':495 'cometchatemailformatt':89 'cometchatfilebubbl':489 'cometchatimagebubbl':473 'cometchatmentionsformatt':81,96,900 'cometchatmessagecompos':19,48,90,259,589,623,639,795,824,846,891,907 'cometchatmessagehead':20,45,62,382,393 'cometchatmessageheaderstyl':418 'cometchatmessagelist':18,46,75,103,560,582,637,792,819,843,858,877,888,904 'cometchatphonenumberformatt':88 'cometchattextbubbl':31,467 'cometchatthemehelp':959 'cometchatthreadedhead':575,812 'cometchatuikit.loggedinuser':579 'cometchatuikit.sendcustommessage':544 'cometchatuikit.sendmediamessage':531 'cometchatuikit.sendtextmessage':520 'cometchaturlformatt':87,102 'cometchatvideobubbl':479 'common':606,769 'compens':603,808 'complet':49 'compon':44,857 'compos':41,57,327,360,443,887,918 'conflict':728,978 'consist':642 'contain':621 'context':69,400,566 'convers':126,281 'conversationtyp':190 'conversationwith':189 'copi':690,867,926 'correct':829,864,895 'cover':17 'ctx':410,563 'current':375 'current.iseditmode':377 'current.isrecordingmode':381 'current.isreplymode':379 'custom':541 'customdata':552 'custommessag':545 'dart':52,237,369,392,516,559,752,782,849,880 'data':707 'date':168 'delet':146,219,494,498 'didchangedepend':962 'differ':882 'direct':704 'disabl':310 'disablement':308 'disablereact':154 'disablereceipt':149 'disabletypingev':282 'dispatch':354 'display':104 'doubl':601,807 'download':492 'durat':487 'edit':213 'empti':244 'enableswipetorepli':159 'ensur':641 'error':245 'especi':768 'event':185,186,710,724 'expand':73,580,790,817,841 'fallback':477 'fals':55,248,250,254,402,404,457,571,599,628,837,914,943 'featur':465 'file':488,533 'final':898 'fix':659 'flutter':3,14,34,730,976 'forget':597 'format':264,325,342 'formatt':172,322,883,897,899,906,909 'function':177 'gestur':162 'gif':475 'go':660 'gotcha':596 'gotomessageid':129,668 'group':65,66,78,79,84,85,93,94,99,100,122,124,277,279,396,397,409,585,586,592,593,689,723,924,953 'grouplisten':772 'handl':58,426 'hasmorenew':253 'hasmoreold':251 'header':169 'heic':476 'hello':523 'hide':145,151,156,167,290,295,300,305,314 'hideattachmentbutton':298 'hidebottomsafearea':312 'hidedatesepar':165 'hidedeletedmessag':143 'hidesendbutton':293 'hidestickersbutton':303 'hidevideocallbutton':401 'hidevoicecallbutton':403 'hidevoicerecordingbutton':288 'hybrid':510 'icon':412,413,491 'iconbutton':411 'icons.info':414 'id':673 'imag':472 'immut':852 'implement':8,650 'import':750,753,970 'incom':206 'inconsist':893 'indic':287,387 'info':385 'initi':191,241 'input':262 'instead':763 'int':130 'integr':609 'interact':428 'intern':60 'isloadingnew':249 'isloadingold':247 'jump':131 'jumptomessag':220 'keep':686 'key':116,271,464 'keyboard':25,59,113,367,422,427,431,450,602 'keyboard-awar':24,112,421 'kick/ban/scope-change':726 'late':868 'latitud':553 'like':725 'link':470 'list':171,320,433,439,634,679,885,916 'listen':700,743,876,950,966 'load':136,192,242,243,669,685 'loadmessag':188 'loadnewermessag':197 'loadoldermessag':193 'local/network':474 'locat':547 'loggedinus':578,815 'longitud':555 'lookup':110 'mandatori':459 'mark':228,233 'markdown':340,471 'markdowntextformatt':86,101,890,903 'markmessageasread':226 'markmessageasunread':231 'match':920 'materialpagerout':567 'may':680 'mean':705 'media':528 'mediamessag':532 'mention':267,311 'messag':5,10,36,38,50,105,134,147,174,202,207,209,215,225,227,232,246,258,460,496,515,518,529,542,562,577,611,670,684,739,775,814,831,947 'message.id':588,595,823,828 'messagecomposerbloc':22,371 'messagecomposerst':372 'messagedelet':214 'messageedit':208 'messageheaderstyl':417 'messageid':221 'messagelistbloc':21,184 'messagelistst':236,238 'messageliststatus.loaded':240 'messagereceiv':201 'messagetypeconstants.image':536 'miss':784 'mix':771 'mixin':744,967 'modul':336,667 'move':444 'multi':346 'multi-seg':345 'must':624 'mutabl':687,865,922 'name':977 'navig':182,931 'navigator.pop':68,399 'navigator.push':565 'normal':348,435 'o':108 'older':683 'onback':67,398 'one':127 'onpress':416 'onthreadrepliesclick':176,561,930 'optim':358 'option':389,503 'outlin':415 'overlay':482 'packag':754 'pad':318 'pagin':196,200 'panel':307 'param':507,854 'parentmessag':576,813 'parentmessageid':587,594,822,827,936 'pass':701,851 'pattern':513,781 'picker':302 'placehold':148 'play':481 'play/pause':486 'posit':142 'prevent':364 'previous':374 'previous.iseditmode':376 'previous.isrecordingmode':380 'previous.isreplymode':378 'prop':117,118,272,273 'purpos':120,187,275 'push':432 'reaction':157 'read':230 'read/delivered':152 'real':204,211,217 'real-tim':203,210,216 'rebuild':365 'receipt':153 'receivertyp':526,539,550 'receivertypeconstants.user':527,540,551 'receiveruid':524,537,548 'record':270,292 'refer':746 'render':341,643,894 'repli':164,558 'requir':56,128 'resizetoavoidbottominset':54,456,570,598,785,802,805,836,913,942 'rich':28,260,323,468,645 'rich_text_editing_controller.dart':662 'richtexteditingcontrol':337 'rule':945 'runtim':657 'safe':316,445 'scaffold':53,569,620,786,804,835,911,939 'screen':11,39,51,612,617,740,776,800,834,934,938,948 'scroll':194,198,222,437 'sdk':699,713,742,875,949,965 'segment':347 'segmentcomposercontrol':344 'send':285,296,514 'set':625 'show':383 'size':493 'skill' 'skill-cometchat-flutter-v6-messages' 'sliveranimatedlist':107 'sliverspac':23,425 'source-cometchat' 'space':27,115,424,505 'span':338 'specif':133,224 'stale':706,861 'start':139 'startfromunreadmessag':137 'state':693,777,866,925 'status':239 'stay':440 'sticker':306 'still':441 'stop':284 'subclass':720 'swipe':161 'system':331,647 'target':125,280 'templat':180,564 'text':29,175,261,321,324,349,466,469,517,522,646 'textformatt':80,95,170,319,629,889,892,905,908,921 'textmessag':521 'theme':511 'thread':181,557,616,799,833,933,937 'three':43 'thumbnail':480 'time':205,212,218 'toolbar':30,265,352 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'track':339 'trailingview':407 'true':252,406,803,806 'type':119,274,286,386,462,490,535,546 'typographi':506 'uikit':15,35,856,971 'uikit/cometchat_chat_uikit.dart':757 'unread':141,235 'unreadcount':255 'unreadmessageanchor':257 'updat':696,872,951 'use':6,328,361,721,741,748,761,964 'user':63,64,76,77,82,83,91,92,97,98,121,123,276,278,394,395,408,583,584,590,591,688,793,794,796,797,816,820,821,825,826,844,845,847,848,859,869,870,873,878,879,901,902,923,952 'user.uid':525,538,549 'user/group':384 'usersstatusvis':405 'v6':4,16 'video':478 'waveform':485 'widget':463,501,736,853 'widget.group':703,929 'widget.user':702,860,871,928 'wrong':783,798,850,881 'wysiwyg':330,653","prices":[{"id":"a09fd722-85dd-4d0c-90be-f379e44394a0","listingId":"08a84eeb-5b8f-4daf-b152-45131e2fc0d8","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-07T13:05:11.563Z"}],"sources":[{"listingId":"08a84eeb-5b8f-4daf-b152-45131e2fc0d8","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-flutter-v6-messages","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-flutter-v6-messages","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:11.563Z","lastSeenAt":"2026-05-18T19:04:51.670Z"}],"details":{"listingId":"08a84eeb-5b8f-4daf-b152-45131e2fc0d8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-flutter-v6-messages","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"e89752df8e9126f43e2824399d173058143d6024","skill_md_path":"skills/cometchat-flutter-v6-messages/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-flutter-v6-messages"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-flutter-v6-messages","license":"MIT","description":"Use when implementing the messages screen with CometChat Flutter UIKit v6. Covers CometChatMessageList, CometChatMessageComposer, CometChatMessageHeader, MessageListBloc, MessageComposerBloc, SliverSpacing, keyboard-aware spacing, rich text toolbar, CometChatTextBubble, CometChatImageBubble, CometChatVideoBubble, CometChatAudioBubble, CometChatFileBubble, CometChatMessageBubble, bubble factories, message templates, send message, edit message, delete message, reply, thread, reactions, receipts, typing indicators, mentions, markdown formatting, text formatters, scroll to bottom, unread messages, mark as read, goToMessageId, message options, swipe to reply, smart replies, conversation starters, or resizeToAvoidBottomInset. Also use when the user asks about building a chat screen, message input, or message display.","compatibility":"cometchat_chat_uikit ^6.0.0-beta2; flutter_bloc ^8.1.0"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-flutter-v6-messages"},"updatedAt":"2026-05-18T19:04:51.670Z"}}