A Flutter package for easy integration of in-app chat functionality, powered by AirCloud. This package provides UI components and backend integration to add real-time messaging to your Flutter application.

Features

  • 💬 Real-time Messaging: One-to-one and group chats.
  • 🎨 Customizable UI: Pre-built, but customizable, widgets for chat lists, chat screens, and message bubbles.
  • 🚀 Push Notifications: Keep users engaged with notifications for new messages.
  • 📎 Attachments: Support for sending and receiving images, videos, and other files.
  • 👀 User Presence: Real-time online/offline status indicators.
  • ✔️ Read Receipts: See when your messages have been delivered and read.
  • ✍️ Typing Indicators: Know when the other person is typing a message.

Getting started

Prerequisites

  • You need a Flutter environment. See Flutter's documentation for help.
  • An account with AirCloud to get your API keys.

Installation

Add aircloud_in_app_chat to your pubspec.yaml file:

dependencies:
  flutter:
    sdk: flutter
  aircloud_in_app_chat: ^0.0.1 # Replace with the latest version

Then, run flutter pub get in your terminal.

Initialization

Before using the package, you need to initialize it, preferably in your main.dart file.

import 'package:flutter/material.dart';
import 'package:aircloud_in_app_chat/aircloud_in_app_chat.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // TODO: Replace with your actual AirCloud API Key
  await AirCloudChat.initialize(
    apiKey: 'YOUR_AIRCLOUD_API_KEY',
    restUrl:'YOUR_AIRCLOUD_REST_URL');
  
  runApp(MyApp());
}

Usage

Here is a small example of how to display a list of chat conversations and open a chat screen.

Displaying a list of chats

import 'package:flutter/material.dart';
import 'package:aircloud_in_app_chat/aircloud_in_app_chat.dart';

class ChatListScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Chats')),
      body: FutureBuilder<List<Chat>>(
        future: AirCloudChat.instance.getChats(), // Fetch user's chats
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          }
          if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          }
          if (!snapshot.hasData || snapshot.data!.isEmpty) {
            return Center(child: Text('No chats yet.'));
          }

          final chats = snapshot.data!;
          return ListView.builder(
            itemCount: chats.length,
            itemBuilder: (context, index) {
              final chat = chats[index];
              return ListTile(
                leading: CircleAvatar(
                  // TODO: Use chat avatar URL
                  // backgroundImage: NetworkImage(chat.avatarUrl),
                ),
                title: Text(chat.name), // TODO: Use chat name
                subtitle: Text(chat.lastMessage.text), // TODO: Use last message
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => ChatScreen(chatId: chat.id),
                    ),
                  );
                },
              );
            },
          );
        },
      ),
    );
  }
}

Opening a chat screen

The package provides a ChatScreen widget that you can push onto the navigation stack.

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => ChatScreen(chatId: 'some_chat_id'),
  ),
);

Additional information

Contributing & Issues

Contributions are welcome! If you would like to contribute, please fork the repository and submit a pull request.

If you encounter any problems or have suggestions, please file an issue on the package's GitHub repository (you may need to add the link here).

License

This package is licensed under the MIT License - see the LICENSE file for details.