In this guide, we will create a simple chat app using Flutter. The app will allow users to send and receive messages in real-time, using Firebase as the backend.
Prerequisites
- Basic understanding of Flutter and Dart
- Flutter SDK installed and set up
- A Firebase project
Step 1: Create a new Flutter project
First, create a new Flutter project using the following command:
flutter create simple_chat_app
Then, navigate to the project directory:
cd simple_chat_app
Open the project in your favorite code editor.
Step 2: Add necessary dependencies
Add the following dependencies to your pubspec.yaml
file:
dependencies: flutter: sdk: flutter cloud_firestore: ^3.1.7 firebase_core: ^1.10.6 firebase_auth: ^6.1.0 dev_dependencies: flutter_test: sdk: flutter
Then, run flutter packages get
to install the new dependencies.
Step 3: Set up Firebase for Flutter
Follow the official documentation to set up Firebase for your Flutter project.
Step 4: Create a Firebase AuthenticationService
In the lib
folder, create a new file called firebase_authentication_service.dart
. This file will contain the code for interacting with Firebase Authentication:
import 'package:firebase_auth/firebase_auth.dart'; class FirebaseAuthService { final FirebaseAuth _firebaseAuth = FirebaseAuth.instance; Future<User?> signInAnonymously() async { try { final userCredential = await _firebaseAuth.signInAnonymously(); return userCredential.user; } catch (e) { print(e); return null; } } }
This class has a single method, signInAnonymously
, which signs the user in anonymously using Firebase Authentication.
Step 5: Update main.dart
In the lib/main.dart
file, replace the code with the following:
import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'chat_screen.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Simple Chat App', theme: ThemeData( primarySwatch: Colors.blue, ), home: ChatScreen(), ); } }
This code initializes Firebase before running the app and sets ChatScreen
as the home screen.
Step 6: Create the ChatScreen
In the lib
folder, create a new file called chat_screen.dart
. This file will define the main screen of our chat app:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'firebase_authentication_service.dart'; class ChatScreen extends StatefulWidget { @override _ChatScreenState createState() => _ChatScreenState(); } class _ChatScreenState extends State<ChatScreen> { final TextEditingController _messageController = TextEditingController(); final FirebaseAuthService _authService = FirebaseAuthService(); @override void initState() { super.initState(); _authService.signInAnonymously(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Simple Chat App'), ), body: Column( children: [ Expanded( child: StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection('messages') .orderBy('timestamp', descending: true) .snapshots(), builder: (context, snapshot) { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } if (snapshot.connectionState == ConnectionState.waiting) { return Center(child: CircularProgressIndicator()); } return ListView.builder( reverse: true, itemCount: snapshot.data!.docs.length, itemBuilder: (context, index) { final message = snapshot.data!.docs[index]; return ListTile( title: Text(message['text']), subtitle: Text(message['sender']), ); }, ); }, ), ), Container( padding: EdgeInsets.symmetric(horizontal: 8.0), child: Row( children: [ Expanded( child: TextField( controller: _messageController, decoration: InputDecoration( hintText: 'Type a message', ), ), ), IconButton( icon: Icon(Icons.send), onPressed: () async { final user = FirebaseAuth.instance.currentUser; if (user != null && _messageController.text.isNotEmpty) { await FirebaseFirestore.instance .collection('messages') .add({ 'text': _messageController.text, 'sender': user.uid, 'timestamp': FieldValue.serverTimestamp(), }); _messageController.clear(); } }, ), ], ), ), ], ), ); } }
This ChatScreen
contains a StreamBuilder
that listens for changes in the Firestore messages
collection, and displays the messages in a ListView.builder
. It also includes a TextField
for entering messages and a send button for submitting messages to Firestore.
Now you can run the app using the following command:
flutter run
You should see the simple chat app displaying a list of messages and a text field for typing new messages. When you send a message, it will be added to the Firestore database and displayed in the app in real-time.
This is just a basic example of creating a chat app in Flutter. You can expand on this concept by adding more features, such as user authentication, displaying user names or avatars, or supporting multimedia messages.