📱 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

Bu blogdaki popüler yayınlar

Dart Programlama Dil Uygulama Sınavı Çalışma Soruları

Dart Uygulama Sınavı: Pardus ETAP 23 Kurulum Otomasyonu

Pardus ETAP 23 İçin Flutter ile Dijital "Öğrenci Seçici" Uygulaması