Chat Toolkit
A comprehensive and customizable chat widget toolkit for Flutter applications. This package provides a complete chat interface with message handling, real-time updates, and extensive customization options.
Features
- Complete Chat Interface: Ready-to-use chat widget with message display and input functionality
- Message Management: Support for different message types (sender/receiver) with state management
- Real-time Updates: Stream-based message handling for live chat experiences
- Customizable UI: Fully customizable message bubbles, profiles, and input fields
- Message States: Built-in support for loading, failed, and success message states
- Message Grouping: Automatic message organization and grouping
- Custom Message Sorting: Configurable priority system for messages with identical timestamps
- Responsive Design: Auto-sizing components that adapt to different screen sizes
- Read-only Mode: Display-only chat interfaces for viewing conversations
- Scroll Management: Intelligent scroll behavior with new message notifications
Getting Started
Add this package to your pubspec.yaml:
dependencies:
chat_toolkit: $latest_version
Then run:
flutter pub get
Quick Start
import 'package:flutter/material.dart';
import 'package:chat_toolkit/chat_toolkit.dart';
class ChatScreen extends StatefulWidget {
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
late ChatController chatController;
@override
void initState() {
super.initState();
chatController = ChatController();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Chat')),
body: Chat(
chatController: chatController,
configuration: ChatConfiguration(),
),
);
}
@override
void dispose() {
chatController.dispose();
super.dispose();
}
}
Core Usage
Adding Messages
// Add a simple text message
chatController.addMessage(
SenderMessage(
name: 'You',
timestamp: DateTime.now().toIso8601String(),
elements: [TextMessageElement(text: 'Hello!')],
),
);
Async Message Sending
final result = await chatController.dispatchMessage(
message,
onDispatch: (message) async {
// Your API call here
final response = await yourApiCall(message);
return response; // Return processed message or null if failed
},
);
Loading More Messages
Chat(
chatController: chatController,
onScrollToTop: () async {
final olderMessages = await fetchOlderMessages();
chatController.appendMessages(olderMessages);
},
)
Customization
Basic Configuration
Chat(
chatController: chatController,
configuration: ChatConfiguration(
senderAlignment: ChatAlignment.end,
bubbleConfiguration: BubbleConfiguration(
maxWidth: 280,
profileBuilder: (context, name) => CustomProfile(name),
senderBubbleBuilder: (context, child) => CustomBubble(child),
),
),
)
Custom Message Elements
class ImageElement extends MessageElement {
final String url;
const ImageElement({required this.url});
@override
Widget toWidget(BuildContext context) {
return Image.network(url);
}
@override
MessageElement copyWith() => ImageElement(url: url);
}
Custom Message Sorting
final controller = ChatController(
customSortCallback: (message1, message2) {
// Custom sorting for messages with identical timestamps
return message1.id.compareTo(message2.id);
},
);
Configuration Options
ChatConfiguration
senderAlignment: Message alignment (start/end)customInputField: Custom input field widgetnewReceiveMessageNotificationBuilder: New message notification builderbubbleConfiguration: Bubble appearance settingsreadOnlyWidget: Widget for read-only mode
BubbleConfiguration
profileBuilder: Custom profile widget buildersenderBubbleBuilder: Custom sender bubble builderreceiverBubbleBuilder: Custom receiver bubble buildertimeBuilder: Custom timestamp builderloadingWidget: Custom loading indicatormaxWidth: Maximum bubble width
Message Types
// Sender message (outgoing)
SenderMessage(
name: 'User Name',
timestamp: DateTime.now().toIso8601String(),
elements: [TextMessageElement(text: 'Hello world!')],
);
// Receiver message (incoming)
ReceiverMessage(
id: 'unique_id',
name: 'Other User',
timestamp: DateTime.now().toIso8601String(),
elements: [TextMessageElement(text: 'Hi there!')],
);
Event Streams
// Listen to dispatch results
chatController.dispatchResultStream.listen((result) {
if (result.isSuccess) {
print('Message sent successfully');
} else {
print('Failed: ${result.exception}');
}
});
// Listen to new received messages
chatController.newReceiveMessageStream.listen((message) {
print('New message: ${message.id}');
});
Requirements
- Flutter SDK: >=3.24.0
- Dart SDK: ^3.5.0
Dependencies
gap: ^3.0.1 - For spacing utilitiesintl: ^0.19.0 - For internationalizationuuid: ^4.5.1 - For unique ID generation
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
For issues, feature requests, or questions, please visit our GitHub repository.
Libraries
- chat/chat
- chat/chat_configuration
- chat/chat_controller
- chat/message/elements/message_element
- chat/message/entity/failed_message_entry
- chat/message/entity/message
- chat/message/entity/message_group
- chat/message/message_bubble
- chat/message/message_container
- chat/message/message_failed
- chat/message/message_loading
- chat/size_detected_widget
- chat_toolkit
- A comprehensive Flutter chat toolkit that provides customizable chat widgets and controllers for building chat interfaces.