📱 PROJE: Duyarlılık Takip Uygulaması
Flutter + Firebase ile “Duyarlılık Takip Uygulaması” için çalışan, sade ama geliştirilebilir FULL PROJE KODU:
🎯 Özellikler
👤 Kullanıcı kayıt / giriş (Firebase Auth)
📝 Günlük duyarlılık ekleme
⭐ Puan sistemi
🏆 Liderlik tablosu
☁️ Firebase Firestore veri tabanı
🗂️ PROJE YAPISI
lib/
├── main.dart
├── services/
│ ├── auth_service.dart
│ └── firestore_service.dart
├── screens/
│ ├── login_screen.dart
│ ├── register_screen.dart
│ ├── home_screen.dart
│ └── leaderboard_screen.dart
└── models/
└── task.dart
📦 pubspec.yaml (EKLE)
dependencies:
flutter:
sdk: flutter
firebase_core: ^2.0.0
firebase_auth: ^4.0.0
cloud_firestore: ^4.0.0
🚀 main.dart
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'screens/login_screen.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: LoginScreen(),
);
}
}
🔐 auth_service.dart
import 'package:firebase_auth/firebase_auth.dart';
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
Future<User?> register(String email, String password) async {
var result = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
return result.user;
}
Future<User?> login(String email, String password) async {
var result = await _auth.signInWithEmailAndPassword(
email: email, password: password);
return result.user;
}
Future<void> logout() async {
await _auth.signOut();
}
}
☁️ firestore_service.dart
import 'package:cloud_firestore/cloud_firestore.dart';
class FirestoreService {
final db = FirebaseFirestore.instance;
Future<void> addTask(String userId, String text) async {
await db.collection("tasks").add({
"userId": userId,
"text": text,
"puan": 10,
"tarih": DateTime.now(),
});
// puan artır
var userRef = db.collection("users").doc(userId);
var userDoc = await userRef.get();
if (userDoc.exists) {
int current = userDoc["puan"] ?? 0;
await userRef.update({"puan": current + 10});
} else {
await userRef.set({"puan": 10});
}
}
Stream<QuerySnapshot> getLeaderboard() {
return db.collection("users").orderBy("puan", descending: true).snapshots();
}
}
🧑💻 login_screen.dart
import 'package:flutter/material.dart';
import '../services/auth_service.dart';
import 'home_screen.dart';
import 'register_screen.dart';
class LoginScreen extends StatelessWidget {
final email = TextEditingController();
final password = TextEditingController();
final auth = AuthService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Giriş")),
body: Column(
children: [
TextField(controller: email, decoration: InputDecoration(labelText: "Email")),
TextField(controller: password, decoration: InputDecoration(labelText: "Şifre")),
ElevatedButton(
onPressed: () async {
var user = await auth.login(email.text, password.text);
if (user != null) {
Navigator.push(context, MaterialPageRoute(builder: (_) => HomeScreen(user.uid)));
}
},
child: Text("Giriş Yap"),
),
TextButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (_) => RegisterScreen()));
},
child: Text("Kayıt Ol"),
)
],
),
);
}
}
📝 register_screen.dart
import 'package:flutter/material.dart';
import '../services/auth_service.dart';
class RegisterScreen extends StatelessWidget {
final email = TextEditingController();
final password = TextEditingController();
final auth = AuthService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Kayıt")),
body: Column(
children: [
TextField(controller: email, decoration: InputDecoration(labelText: "Email")),
TextField(controller: password, decoration: InputDecoration(labelText: "Şifre")),
ElevatedButton(
onPressed: () async {
await auth.register(email.text, password.text);
Navigator.pop(context);
},
child: Text("Kayıt Ol"),
)
],
),
);
}
}
🏠 home_screen.dart
import 'package:flutter/material.dart';
import '../services/firestore_service.dart';
import 'leaderboard_screen.dart';
class HomeScreen extends StatelessWidget {
final String userId;
final controller = TextEditingController();
final service = FirestoreService();
HomeScreen(this.userId);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Duyarlılık Uygulaması"),
actions: [
IconButton(
icon: Icon(Icons.leaderboard),
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (_) => LeaderboardScreen()));
},
)
],
),
body: Column(
children: [
TextField(controller: controller, decoration: InputDecoration(labelText: "Bugün ne yaptın?")),
ElevatedButton(
onPressed: () async {
await service.addTask(userId, controller.text);
controller.clear();
},
child: Text("Ekle (+10 puan)"),
)
],
),
);
}
}
🏆 leaderboard_screen.dart
import 'package:flutter/material.dart';
import '../services/firestore_service.dart';
class LeaderboardScreen extends StatelessWidget {
final service = FirestoreService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Liderlik Tablosu")),
body: StreamBuilder(
stream: service.getLeaderboard(),
builder: (context, snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
var docs = snapshot.data!.docs;
return ListView.builder(
itemCount: docs.length,
itemBuilder: (context, i) {
var user = docs[i];
return ListTile(
title: Text("Kullanıcı ${i + 1}"),
trailing: Text("${user["puan"]} puan"),
);
},
);
},
),
);
}
}
🔐 Firebase Firestore Kuralları (TEST İÇİN)
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
⚠️ Gerçek projede güvenlik ekle!
🎯 GELİŞTİRME FİKİRLERİ
Bunu bir üst seviyeye taşıyalım:
🔔 Bildirim sistemi (Firebase Messaging)
🧠 AI öneri (bugün ne yapabilirsin?)
📊 Grafik (haftalık puan)
🧑🏫 Öğretmen paneli
🎯 Görev listesi (hazır iyilikler)
🎁 SONRAKİ ADIM
👉 Admin panel (web + Flutter)
👉 Öğrenci / sınıf bazlı puan sistemi
👉 Rozet (badge) sistemi 🏅
👉 Tam profesyonel UI (Material 3)
Yorumlar
Yorum Gönder