swift_chat 1.2.1 copy "swift_chat: ^1.2.1" to clipboard
swift_chat: ^1.2.1 copied to clipboard

A highly customizable and easy-to-use chat UI package for Flutter. It provides a complete chat screen designed to be powered by a real-time backend like WebSockets.

SwiftChat: A Real-Time Chat UI for Flutter #

SwiftChat is a highly customizable and easy-to-use chat UI package for Flutter. It provides a complete, responsive chat screen designed to work with any real-time backend (like WebSockets), making it simple to build modern chat applications with text and media sharing support.


✨ Features #

  • 💬 Complete Chat UI -- Pre-built chat screen with message bubbles and a message composer.\
  • 🖼️ Media Sharing -- Optional "attach file" button for sending and displaying images.\
  • 🔌 Backend Agnostic -- Works with any WebSocket backend using a stream-based architecture.\
  • 🎨 Highly Customizable -- Change colors, text styles, and input decorations via SwiftChatTheme.\
  • 🚀 Lightweight & Performant -- Optimized for performance with minimal footprint.

🚀 Installation #

Add swift_chat and dependencies to your pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  swift_chat: ^1.2.0   # Use the latest version from pub.dev
  web_socket_channel: ^2.4.0
  image_picker: ^1.0.0

Install packages:

flutter pub get

📱 Example Usage #

A complete example with text and image sending:

import 'package:flutter/material.dart';
import 'package:swift_chat/swift_chat.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:convert';
import 'dart:math';

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'SwiftChat Example',
      home: ChatScreen(),
    );
  }
}

class ChatScreen extends StatefulWidget {
  const ChatScreen({super.key});

  @override
  State<ChatScreen> createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final _currentUser = ChatUser(
    id: 'user_${Random().nextInt(9999)}',
    name: 'You',
  );
  final List<ChatMessage> _messages = [];
  final _channel = WebSocketChannel.connect(
    Uri.parse('ws://localhost:8080'), // Your WebSocket server address
  );

  @override
  void initState() {
    super.initState();
    _channel.stream.listen((data) {
      final decoded = jsonDecode(data);
      final user = ChatUser(id: decoded['userId'], name: decoded['userName']);
      final mediaType =
          decoded['mediaType'] == 'image' ? MediaType.image : MediaType.text;

      final message = ChatMessage(
        id: decoded['id'],
        user: user,
        createdAt: DateTime.parse(decoded['createdAt']),
        text: decoded['text'],
        mediaUrl: decoded['mediaUrl'],
        mediaType: mediaType,
      );

      if (mounted) {
        setState(() {
          _messages.add(message);
        });
      }
    });
  }

  void _handleSend(String text) {
    final message = ChatMessage(
      id: 'msg_${Random().nextInt(9999)}',
      text: text,
      user: _currentUser,
      createdAt: DateTime.now(),
      mediaType: MediaType.text,
    );
    _sendMessage(message);
  }

  Future<void> _handleAttachFile() async {
    final result = await ImagePicker().pickImage(
      imageQuality: 70,
      maxWidth: 1440,
      source: ImageSource.gallery,
    );

    if (result != null) {
      const imageUrl = 'https://placehold.co/600x400.png';
      final message = ChatMessage(
        id: 'msg_${Random().nextInt(9999)}',
        user: _currentUser,
        createdAt: DateTime.now(),
        mediaUrl: imageUrl,
        mediaType: MediaType.image,
      );
      _sendMessage(message);
    }
  }

  void _sendMessage(ChatMessage message) {
    setState(() {
      _messages.add(message);
    });

    final messageData = {
      'id': message.id,
      'text': message.text,
      'userId': message.user.id,
      'userName': message.user.name,
      'createdAt': message.createdAt.toIso8601String(),
      'mediaUrl': message.mediaUrl,
      'mediaType': message.mediaType.name,
    };
    _channel.sink.add(jsonEncode(messageData));
  }

  @override
  void dispose() {
    _channel.sink.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('SwiftChat Example')),
      body: SwiftChat(
        currentUser: _currentUser,
        messages: _messages,
        onSend: _handleSend,
        onAttachFile: _handleAttachFile,
      ),
    );
  }
}

🎨 Customization #

You can fully customize the UI with SwiftChatTheme:

SwiftChat(
  currentUser: _currentUser,
  messages: _messages,
  onSend: _handleSend,
  theme: const SwiftChatTheme(
    primaryBubbleColor: Colors.deepPurple,
    secondaryBubbleColor: Color(0xFFF0F0F0),
    sendButtonColor: Colors.deepPurple,
    primaryTextStyle: TextStyle(color: Colors.white, fontSize: 16),
  ),
)

📎 Media Sharing (Optional) #

The media sharing option is completely optional.
The attach file button will only appear if you provide the onAttachFile callback to the SwiftChat widget.

✅ To Enable Media Sharing: #

// The attach button will be visible
SwiftChat(
  // ... other properties
  onAttachFile: _handleAttachFile, 
)

✨ For a Text-Only Chat: #

// The attach button will be hidden
SwiftChat(
  // ... other properties
  // onAttachFile is not included
)

🛠 SwiftChatTheme Properties #


Property Type Description


backgroundColor Color Background color of the chat screen

primaryBubbleColor Color Bubble color for the current user

secondaryBubbleColor Color Bubble color for other users

primaryTextStyle TextStyle Text style for current user messages

secondaryTextStyle TextStyle Text style for other users messages

composerBackgroundColor Color Background color of the message composer

sendButtonColor Color Color of the send button icon

inputDecoration InputDecoration Decoration for the composer's text field #


🤝 Contributing #

Contributions are welcome!
If you find a bug or want a new feature, please open an issue or PR on our GitHub repository.


📜 License #

This package is licensed under the MIT License.

11
likes
160
points
33
downloads

Publisher

unverified uploader

Weekly Downloads

A highly customizable and easy-to-use chat UI package for Flutter. It provides a complete chat screen designed to be powered by a real-time backend like WebSockets.

Repository (GitHub)
View/report issues

Topics

#chat #messaging #ui #websocket #flutter-widgets

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on swift_chat