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: flutter4firebase_core: ^2.24.05firebase_database: ^10.2.06intl: ^0.19.0Firebase 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:
1import 'package:flutter/material.dart';2import 'package:firebase_core/firebase_core.dart';3import 'package:firebase_database/firebase_database.dart';4import 'firebase_options.dart';56void main() async {7WidgetsFlutterBinding.ensureInitialized();8await Firebase.initializeApp(9options: DefaultFirebaseOptions.currentPlatform,10);11runApp(const ChatApp());12}1314class ChatApp extends StatelessWidget {15const ChatApp({Key? key}): super(key: key);1618Widget build(BuildContext context) {19return MaterialApp(20title: 'Chat',21theme: ThemeData(primarySwatch: Colors.blue),22home: const ChatScreen(),23);24}25}2627class ChatScreen extends StatefulWidget {28const ChatScreen({Key? key}): super(key: key);2931State<ChatScreen> createState() => _ChatScreenState();32}3334class _ChatScreenState extends State<ChatScreen> {35final TextEditingController _controller = TextEditingController();36final DatabaseReference _messagesRef =37FirebaseDatabase.instance.ref('messages');3839void _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}4850Widget 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).
0 yorum