Ground truth:
catalogs/flutter-v6.json— 296 symbols, compiler-verified against the published 6.1.0, withsymbolsByBarrelrecording which barrel each resolves from. The lists below are that catalog, grouped. If a name is not in the catalog it does not exist — do not emit it. Props come from the docs.mdtwin (../cometchat-flutter-v6-core/references/docs-map.md), never from memory.
Companion skills (read first)
cometchat-flutter-v6-core— install, credentials,init→login→render, the two barrels. This skill ASSUMES it and does not repeat it.
Use this skill when
Choosing, composing, or swapping UI Kit widgets; "which widgets exist"; customizing a list, message, or bubble.
Prerequisites & install
Covered by core. This skill adds no package.
Widget catalog (BAKED closed list — from the catalog)
Lists & screens: CometChatConversations · CometChatUsers · CometChatGroups · CometChatGroupMembers · CometChatSearch · CometChatNotificationFeed
Messages: CometChatMessageHeader · CometChatMessageList · CometChatMessageComposer · CometChatThreadedHeader · CometChatMessageInformation · CometChatMessagePreview · CometChatReactions · CometChatReactionList · CometChatMediaRecorder · CometChatEmojiKeyboard · CometChatStickerKeyboard
Bubbles: CometChatTextBubble · CometChatImageBubble · CometChatVideoBubble · CometChatAudioBubble · CometChatFileBubble · CometChatVoiceNoteBubble · CometChatDeletedBubble · CometChatActionBubble · CometChatMessageBubble · CometChatLinkPreviewBubble · CometChatPollsBubble · CometChatStickerBubble · CometChatCollaborativeBubble · CometChatStreamBubble · CometChatAIAssistantBubble · CometChatCallBubble
Groups: CometChatChangeScope · CometChatCreatePoll
AI: CometChatAISmartRepliesView · CometChatAIConversationStarterView · CometChatAIConversationSummaryView · CometChatAIAssistantChatHistory · CometChatAIAssistantEvents
Theme primitives: CometChatColorPalette · CometChatTypography · CometChatSpacing · CometChatThemeHelper (→ -customization)
CometChatMediaRecorderandCometChatEmojiKeyboardare REAL in Flutter v6 even though they are phantoms in the React pack. Never carry another family's phantom list here — checkcatalogs/flutter-v6.json. Plural/singular matters:CometChatPollsBubble(notPollBubble),CometChatThreadedHeader(notThreadHeader).CometChatImagesBubble/CometChatAudiosBubble/CometChatFilesBubble/CometChatVideosBubblealso exist as the multi-attachment variants — the singular forms are the standard bubbles. Exception:CometChatAudioBubbleis a deprecated typedef alias forCometChatVoiceNoteBubble(audio_bubble/cometchat_voice_note_bubble.dart) — useCometChatVoiceNoteBubble(single voice note) orCometChatAudiosBubble(multi-attachment) instead; it compiles today but rides a deprecated symbol (AUDIT-233). The message-translation bubble is UN-prefixed (MessageTranslationBubble); only its style class carries the prefix.
Calls widgets live in the OTHER barrel (compile trap)
CometChatIncomingCall · CometChatOutgoingCall · CometChatOngoingCall · CometChatCallButtons · CometChatCallLogs · CometChatCallBubble · CometChatCalls resolve only from:
dartimport 'package:cometchat_chat_uikit/cometchat_calls_uikit.dart';
That barrel does not re-export the chat widgets, so a calls screen imports both. Detail: cometchat-flutter-v6-calls.
Swap / compose slots
- Custom UI goes IN a widget's slot, never stacked beside it. Every list widget exposes
listItemView(replace the whole row) plus finer slots —leadingStateView·titleView·subtitleView·trailingView— and state slotsloadingStateView/emptyStateView/errorStateView. - Check the parameter ORDER before writing a slot. v6 slots are not uniform:
CometChatConversations.leadingViewis(context, conversation), whileCometChatMessageHeader.subtitleViewis(group, user, context). Fetch the widget's.mdtwin rather than assuming. - Prefer configuring the highest-level widget over rebuilding it from bubbles.
- Reuse built-in callbacks before adding your own control —
onItemTap·onItemLongPress·onSelection·onBack·onError·onLoad. Note the arity differs by widget:CometChatUsers/CometChatGroupstakeonItemTap: (context, item), whileCometChatConversations/CometChatGroupMemberstakeonItemTap: (item). - Scope data with the request builder, not a client-side filter:
conversationsRequestBuilder·usersRequestBuilder·groupsRequestBuilder·groupMembersRequestBuilder.
Swapping a bubble (message templates)
There is no per-bubble prop on the list — a custom bubble is a CometChatMessageTemplate whose bubbleView you override. Defaults come from MessageTemplateUtils (v6 replaced the v5 DataSource; CometChatUIKit.getDataSource() is gone).
Which prop you pass it to is NOT interchangeable (message-list § Message Templates; customization-view-slots; customization-datasource):
addTemplate:— merges with the defaults. This is the one for a message type of your own.templates:— replaces the whole default set.
Reach for addTemplate: for anything the kit does not already ship, and templates: only when you deliberately want to drop the defaults. Templates are keyed category_type, so an addTemplate: entry matching an existing key overrides just that bubble (customization-datasource).
Do not try to widen the list's fetch with your own builder: message-list states that uid, guid, types and categories on a MessagesRequestBuilder are always overridden inside the message list.
Overriding a type the kit already ships (templates:):
dartimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart'; import 'package:flutter/material.dart'; final textTemplate = CometChatMessageTemplate( type: CometChatMessageType.text, category: CometChatMessageCategory.message, bubbleView: (message, context, alignment) => message is TextMessage ? Text(message.text) : const SizedBox.shrink(), );
Adding a type of your own (addTemplate:):
dartimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart'; import 'package:flutter/material.dart'; final diceRollTemplate = CometChatMessageTemplate( type: 'game_roll', // your own type string category: CometChatMessageCategory.custom, // CustomMessage is always `custom` bubbleView: (message, context, alignment) => Text( message is CustomMessage ? '${message.customData?['value']}' : ''), ); Widget gameChat(Group group) => CometChatMessageList( group: group, addTemplate: [diceRollTemplate], // `templates:` here would render nothing );
Creating a group (host-composed — no kit widget)
v6 ships no create-group widget; build the form yourself and create with the SDK. It MUST offer all three types — Public · Private · Password-protected — with the password field required for the third.
dartimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart'; Future<void> createGroup(String guid, String name, String? password) async { final group = Group( guid: guid, name: name, type: CometChatGroupType.password, password: password); // NOTE: `group:` is a NAMED parameter, and onSuccess/onError are both required. await CometChat.createGroup(group: group, onSuccess: (g) {}, onError: (e) {}); }
Common pitfalls (BAKED)
- Emitting a widget that isn't in the catalog — the #1 hallucination. Check first.
- Importing a calls widget from the chat barrel — does not compile (see above).
- Assuming a slot's parameter order or arity — v6 is inconsistent between widgets; fetch the twin.
- Stacking custom UI beside a widget instead of passing it into the slot.
- Emitting a widget below its
contracts.flutter-v6.jsonminimum — a group-details screen needs view/kick/ban/scope, not just a member list. - Hand-rolling moderation or report UI — both are automatic in
CometChatMessageList. - v5 shells (
CometChatConversationsWithMessages,CometChatMessages,CometChatUI,CometChatUserList) — all removed; the host composes screens (→-migration).
Verify it works
The widget renders and its data populates. Empty ⇒ confirm init + login completed before the screen built (core's gate), and that any list has a bounded height (Expanded).

