Skip to main content
FieldValue
Packagecometchat_chat_uikit
Key componentsCometChatThread, CometChatThreadedHeader, CometChatMessageList, CometChatMessageComposer
InitCometChatUIKit.init(uiKitSettings) then CometChatUIKit.login(uid)
Entry pointCometChatMessageList.onThreadRepliesClick opens thread view from messages
Sample appGitHub
RelatedAll Guides
Threaded messages let users create sub-conversations by replying to specific messages. This reduces clutter and keeps discussions focused. Before starting, complete the Getting Started guide.

Components

Component / ClassRole
CometChatThreadMain container widget for threaded messages
CometChatThreadedHeaderDisplays parent message and thread context
CometChatMessageListShows messages filtered by parentMessageId
CometChatMessageComposerInput for composing threaded replies
MessagesRequestBuilderBuilds request to fetch thread replies

Integration Steps

1. Thread Trigger in Messages

Wire the onThreadRepliesClick callback on CometChatMessageList. When a user clicks the thread reply icon on any message, this fires with the parent message object. File: messages.dart
CometChatMessageList(
  onThreadRepliesClick: (BaseMessage message) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (_) => CometChatThread(
          message: message,
          user: user,
          group: group,
        ),
      ),
    );
  },
);

2. Thread Screen Widget

Create the thread screen with header, message list, and composer. The CometChatThread widget handles the complete thread UI. File: cometchat_thread.dart
class CometChatThread extends StatefulWidget {
  const CometChatThread({
    this.user,
    this.group,
    required this.message,
    super.key,
  });

  final User? user;
  final Group? group;
  final BaseMessage message;

  @override
  State<CometChatThread> createState() => _CometChatThreadState();
}

3. Thread Header and Message List

Display the parent message context and threaded replies using CometChatThreadedHeader and CometChatMessageList with parentMessageId. File: cometchat_thread.dart
Column(
  children: [
    CometChatThreadedHeader(
      parentMessage: widget.message,
      loggedInUser: CometChatUIKit.loggedInUser!,
    ),
    Expanded(
      child: CometChatMessageList(
        user: widget.user,
        group: widget.group,
        messagesRequestBuilder: MessagesRequestBuilder()
          ..parentMessageId = widget.message.id,
      ),
    ),
  ],
)

4. Thread Composer

Add the message composer with parentMessageId to send replies in the thread context. File: cometchat_thread.dart
CometChatMessageComposer(
  user: widget.user,
  group: widget.group,
  parentMessageId: widget.message.id,
)

5. Blocked User Handling

When a user is blocked, replace the composer with an unblock prompt. File: cometchat_thread.dart
Widget getComposer(CometChatThreadController controller) {
  if (controller.user?.blockedByMe == true) {
    return Container(
      padding: EdgeInsets.symmetric(vertical: 8, horizontal: 20),
      child: Column(
        children: [
          Text(Translations.of(context).cantSendMessageBlockedUser),
          ElevatedButton(
            onPressed: () => controller.unBlockUser(),
            child: Text(Translations.of(context).unBlock),
          ),
        ],
      ),
    );
  }
  return CometChatMessageComposer(
    user: widget.user,
    group: widget.group,
    parentMessageId: widget.message.id,
  );
}

Feature Matrix

FeatureComponent / MethodFile
Show thread optiononThreadRepliesClickmessages.dart
Thread screenCometChatThreadcometchat_thread.dart
Thread headerCometChatThreadedHeadercometchat_thread.dart
Display thread msgsCometChatMessageListcometchat_thread.dart
Compose replyCometChatMessageComposercometchat_thread.dart
Thread controllerCometChatThreadControllercometchat_thread_controller.dart

Next Steps