Flutter ve Firebase ile Gerçek Zamanlı Chat Uygulaması

Firebase Realtime Database, gerçek zamanlı veri senkronizasyonu için ideal. Flutter ile birleştirince mobil chat uygulaması yapmak basit hale geliyor.

İlk olarak pubspec.yaml dosyasına gerekli paketleri ekle:

1dependencies:
2flutter:
3sdk: flutter
4firebase_core: ^2.24.0
5firebase_database: ^10.2.0
6intl: ^0.19.0

Firebase Console'dan yeni bir proje oluştur, Android ve iOS uygulamalarını ekle, indirilen yapılandırma dosyalarını (google-services.json ve GoogleService-Info.plist) proje klasörlerine koy.

Ana ekran widget'ını oluştur:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import 'package:flutter/material.dart';
2import 'package:firebase_core/firebase_core.dart';
3import 'package:firebase_database/firebase_database.dart';
4import 'firebase_options.dart';
5
6void main() async {
7WidgetsFlutterBinding.ensureInitialized();
8await Firebase.initializeApp(
9options: DefaultFirebaseOptions.currentPlatform,
10);
11runApp(const ChatApp());
12}
13
14class ChatApp extends StatelessWidget {
15const ChatApp({Key? key}): super(key: key);
16
18Widget build(BuildContext context) {
19return MaterialApp(
20title: 'Chat',
21theme: ThemeData(primarySwatch: Colors.blue),
22home: const ChatScreen(),
23);
24}
25}
26
27class ChatScreen extends StatefulWidget {
28const ChatScreen({Key? key}): super(key: key);
29
31State<ChatScreen> createState() => _ChatScreenState();
32}
33
34class _ChatScreenState extends State<ChatScreen> {
35final TextEditingController _controller = TextEditingController();
36final DatabaseReference _messagesRef =
37FirebaseDatabase.instance.ref('messages');
38
39void _sendMessage() {
40if (_controller.text.isEmpty) return;
41_messagesRef.push().set({
42'text': _controller.text,
43'timestamp': DateTime.now().millisecondsSinceEpoch,
44'user': 'User${DateTime.now().millisecond}',
45});
46_controller.clear();
47}
48
50Widget build(BuildContext context) {
51return Scaffold(
52appBar: AppBar(title: const Text('Chat')),
53body: Column(
54children: [
55Expanded(
56child: StreamBuilder(
57stream: _messagesRef.onValue,
58builder: (context, snapshot) {
59if (!snapshot.hasData) {
60return const Center(child: CircularProgressIndicator());
61}
62final messages = <Map<String, dynamic>>[];
63final data = snapshot.data!.snapshot.value as Map?;
64if (data!= null) {
65data.forEach((key, value) {
66messages.add({...value as Map, 'id': key});
67});
68messages.sort((a, b) =>
69(a['timestamp'] as int).compareTo(b['timestamp'] as int));
70}
71return ListView.builder(
72itemCount: messages.length,
73itemBuilder: (context, index) {
74final msg = messages[index];
75return ListTile(
76title: Text(msg['text']),
77subtitle: Text(msg['user']),
78);
79},
80);
81},
82),
83),
84Padding(
85padding: const EdgeInsets.all(8.0),
86child: Row(
87children: [
88Expanded(
89child: TextField(
90controller: _controller,
91decoration: const InputDecoration(hintText: 'Mesaj yaz...'),
92),
93),
94IconButton(
95icon: const Icon(Icons.send),
96onPressed: _sendMessage,
97),
98],
99),
100),
101],
102),
103);
104}
105}

Kodun ne yaptığını kısaca açıkla: Firebase'i başlatıyor, mesajları gerçek zamanlı olarak dinliyor ve yeni mesaj gönderdiğinde veritabanına kaydediyor. StreamBuilder sayesinde yeni mesaj geldiğinde liste otomatik güncelleniyor.

Beklenen çıktı: Uygulama açıldığında boş bir chat ekranı görürsün. Mesaj yazıp gönderdikçe ekranda görünür ve başka cihazdan da senkronize şekilde gözükür.

Sık yapılan hata: Firebase kurallarını ayarlamadan uygulamayı test etmeye çalışmak. Firebase Console'da Database Rules sekmesinde okuma/yazma izinlerini test için açık bırak (üretim öncesi kısıtla).

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz