Skip to main content
Version: v5

Conversation List + Message View

The Conversation List + Message View layout provides a seamless two-panel chat interface, commonly seen in modern messaging apps like WhatsApp Web, Slack, and Microsoft Teams.

This layout allows users to switch between conversations while keeping the active chat open, delivering a smooth, real-time messaging experience.

Image

Step 1: Render the Conversation Component

The CometChatConversations widget displays all conversations related to the currently logged-in user. Follow the steps below to render this component:

main.dart
  
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: CometChatConversations(
showBackButton: true,
onItemTap: (conversation) {

final target = conversation.conversationWith;

Navigator.push(
context,
MaterialPageRoute(
builder: (_) => MessagesScreen(
user: target is User ? target : null,
group: target is Group ? target : null,
),
),
);
},
),
),
);
}

Full Example: main.dart

main.dart
import 'package:flutter/material.dart';
import 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';
import 'package:cometchat_calls_uikit/cometchat_calls_uikit.dart'; //Optional: Include if you're using Audio/Video Calling
import 'messages_screen.dart';
import 'cometchat_config.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
const MyApp({super.key});


Widget build(BuildContext context) {
return MaterialApp(
title: 'CometChat UI Kit',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const Home(),
);
}
}

class Home extends StatelessWidget {
const Home({super.key});

Future<void> _initializeAndLogin() async {
final settings = UIKitSettingsBuilder()
..subscriptionType = CometChatSubscriptionType.allUsers
..autoEstablishSocketConnection = true
..appId = CometChatConfig.appId
..region = CometChatConfig.region
..authKey = CometChatConfig.authKey
..extensions = CometChatUIKitChatExtensions.getDefaultExtensions() //Replace this with empty array, if you want to disable all extensions
..callingExtension = CometChatCallingExtension(); //Optional: Include if you're using Audio/Video Calling

await CometChatUIKit.init(uiKitSettings: settings.build());
await CometChatUIKit.login(
'cometchat-uid-1',
onSuccess: (_) => debugPrint('✅ Login Successful'),
onError: (err) => throw Exception('Login Failed: $err'),
);
}


Widget build(BuildContext context) {
return FutureBuilder<void>(
future: _initializeAndLogin(),
builder: (ctx, snap) {
if (snap.connectionState != ConnectionState.done) {
return const Scaffold(
body: SafeArea(
child: Center(child: CircularProgressIndicator()),
),
);
}
if (snap.hasError) {
return Scaffold(
body: SafeArea(
child: Center(
child: Text(
'Error starting app:\n${snap.error}',
textAlign: TextAlign.center,
),
),
),
);
}
return const ConversationsPage();
},
);
}
}

class ConversationsPage extends StatelessWidget {
const ConversationsPage({super.key});


Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: CometChatConversations(
showBackButton: true,
onItemTap: (conversation) {

final target = conversation.conversationWith;

Navigator.push(
context,
MaterialPageRoute(
builder: (_) => MessagesScreen(
user: target is User ? target : null,
group: target is Group ? target : null,
),
),
);
},
),
),
);
}
}

Step 2: Render the Messages Component

To create a complete messaging view, include the following components in messages_screen.dart:

Image
messages_screen.dart
import 'package:flutter/material.dart';
import 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';

class MessagesScreen extends StatefulWidget {
final User? user;
final Group? group;

const MessagesScreen({Key? key, this.user, this.group}) : super(key: key);


State<MessagesScreen> createState() => _MessagesScreenState();
}

class _MessagesScreenState extends State<MessagesScreen> {

Widget build(BuildContext context) {
return Scaffold(
appBar: CometChatMessageHeader(
user: widget.user,
group: widget.group,
),
body: SafeArea(
child: Column(
children: [
Expanded(
child: CometChatMessageList(
user: widget.user,
group: widget.group,
),
),
CometChatMessageComposer(
user: widget.user,
group: widget.group,
),
],
),
),
);
}
}

Step 3: Run the App

Use the following command to run the app on a connected device or emulator:

flutter run

This will launch the app and display the Conversation List. Tapping a conversation will navigate to the Message View.


Next Steps

Enhance the User Experience