Flutter & Mobil İle İleri Düzey Takvim Ve Etkinlik Planlayıcı Nasıl Yapılır?

Flutter & Mobil İle İleri Düzey Takvim Ve Etkinlik Planlayıcı Nasıl Yapılır?
Flutter & Mobil İle İleri Düzey Takvim Ve Etkinlik Planlayıcı Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 standartlarında Flutter 3.24 veya üzeri bir sürüm kullanmanız önerilir. Ayrıca, takvim yönetimi için sektör standardı haline gelen table_calendar paketini kullanacağız.

  • Flutter SDK (En güncel kararlı sürüm)
  • IDE: VS Code veya Android Studio
  • Bağımlılıklar: table_calendar (takvim arayüzü), intl (tarih formatlama), shared_preferences (yerel veri saklama)

Projenizin pubspec.yaml dosyasına gerekli paketleri eklemek için aşağıdaki komutu terminalinizde çalıştırın:

flutter pub add table_calendar intl shared_preferences

Takvim Arayüzünü Kurma ve Yapılandırma

İlk adımda, kullanıcının tarihleri seçebileceği ve etkinlikleri görebileceği temel takvim bileşenini oluşturacağız. table_calendar paketi, özelleştirilebilir bir takvim yapısı sunarak geliştirme süresini ciddi oranda kısaltır.

TableCalendar(
  firstDay: DateTime.utc(2025, 1, 1),
  lastDay: DateTime.utc(2030, 12, 31),
  focusedDay: _focusedDay,
  calendarFormat: _calendarFormat,
  onDaySelected: (selectedDay, focusedDay) {
    setState(() {
      _selectedDay = selectedDay;
      _focusedDay = focusedDay;
    });
  },
)

Yukarıdaki kod bloğu, takvimin başlangıç ve bitiş tarihlerini belirler ve kullanıcı bir güne tıkladığında _selectedDay değişkenini günceller. Bu, uygulamanın durum yönetiminin temelini oluşturur.

Etkinlik Modeli ve Veri Yapısı Oluşturma

Etkinlikleri yönetmek için nesne yönelimli bir yaklaşım benimsemeliyiz. Her etkinlik bir başlığa, açıklamaya ve tarihe sahip olmalıdır. Verileri yerel olarak saklayacağımız için bu nesneleri JSON formatına dönüştürebilir yapıda tasarlamalıyız.

class Event {
  final String title;
  final DateTime date;

  Event({required this.title, required this.date});

  Map toJson() => {
    'title': title,
    'date': date.toIso8601String(),
  };

  factory Event.fromJson(Map json) => Event(
    title: json['title'],
    date: DateTime.parse(json['date']),
  );
}

Bu model sınıfı, etkinlik verilerinizin tip güvenli (type-safe) bir şekilde işlenmesini sağlar. toJson ve fromJson metotları, verilerin yerel depolama birimlerine yazılıp okunması için zorunludur.

Etkinlikleri Yerel Depolamada Saklama

Kullanıcıların oluşturduğu etkinliklerin uygulama kapandığında silinmemesi gerekir. 2026 standartlarında basit veriler için shared_preferences yeterli olsa da, daha karmaşık ilişkiler için SQLite veya Hive tercih edilmelidir. Burada shared_preferences ile basit bir kayıt mekanizması kuruyoruz.

Future saveEvent(Event event) async {
  final prefs = await SharedPreferences.getInstance();
  List events = prefs.getStringList('my_events') ?? [];
  events.add(jsonEncode(event.toJson()));
  await prefs.setStringList('my_events', events);
}

Bu fonksiyon, mevcut etkinlik listesini çeker, yeni etkinliği JSON formatında ekler ve tekrar diske yazar. Bu işlemler asenkron (async) yürütülmelidir ki arayüz donmasın.

Takvim ve Etkinlik Yönetimi Karşılaştırması

Takvim uygulamanızda kullanabileceğiniz farklı veri depolama yöntemlerini aşağıda karşılaştırdık:

Yöntem Avantajı Dezavantajı
Shared Preferences Çok hızlı kurulum, basit veri Büyük verilerde yavaş, sorgulama yok
SQLite (sqflite) İlişkisel veritabanı, güçlü sorgu Daha fazla kod yazımı gerektirir
Hive Çok hızlı, NoSQL, nesne tabanlı Ekstra bağımlılık gerektirir

Etkinlikleri Takvim Üzerinde Gösterme

Kullanıcının seçtiği güne ait etkinlikleri listelemek için eventLoader özelliğini kullanırız. Bu özellik, takvimin ilgili tarihte bir etkinlik olup olmadığını anlamasını sağlar.

List _getEventsForDay(DateTime day) {
  return _allEvents.where((event) => isSameDay(event.date, day)).toList();
}

// TableCalendar içinde kullanımı:
eventLoader: _getEventsForDay,

Bu metot, her gün için etkinlik listesini filtreleyerek takvim hücrelerinde küçük işaretçiler (markers) oluşmasını sağlar. Böylece kullanıcı hangi günlerde etkinliği olduğunu görsel olarak kolayca anlar.

Kritik Güvenlik Uyarısı: Kullanıcıdan alınan etkinlik başlığı veya açıklaması gibi metin verilerini asla doğrudan bir web servisine veya yerel veritabanına "sanitizasyon" yapmadan göndermeyin. Her ne kadar yerel depolama güvenli olsa da, ileride bir backend entegrasyonu yaparsanız XSS ve SQL Injection saldırılarına karşı verileri doğrulayın.

Sıkça Sorulan Sorular

Takvimde etkinlik işaretçilerini nasıl özelleştirebilirim?

calendarBuilders özelliğini kullanarak markerBuilder içerisinde kendi widget'larınızı döndürebilirsiniz. Bu sayede etkinlik sayısına göre farklı renklerde noktalar gösterebilirsiniz.

Uygulama neden etkinlikleri listelemiyor?

Genellikle isSameDay fonksiyonunun yanlış kullanımı veya tarih formatlarının (UTC vs Local) uyuşmazlığından kaynaklanır. Tarihleri her zaman UTC formatında saklamaya özen gösterin.

Daha fazla etkinlik verisi için hangi veritabanını seçmeliyim?

Eğer binlerce etkinlikten bahsediyorsak, kesinlikle Hive veya ObjectBox gibi NoSQL veritabanlarını tercih etmelisiniz; çünkü bunlar disk üzerinde çok daha performanslı çalışır.

Etkinliklere bildirim ekleyebilir miyim?

Evet, flutter_local_notifications paketini entegre ederek, etkinlik saatinden önce kullanıcıya hatırlatıcı bildirimler gönderebilirsiniz.

Uygulama performansını nasıl artırırım?

Liste görünümlerinde ListView.builder kullanarak sadece ekrandaki öğelerin oluşturulmasını sağlayın ve gereksiz setState tetiklemelerinden kaçının.

Yasal Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Ticari bir uygulamada veri güvenliği, GDPR uyumluluğu ve kullanıcı gizliliği politikalarını mutlaka uygulamanız gerekmektedir. Yazılım mimarisindeki hatalardan doğacak veri kayıplarından yazar sorumlu tutulamaz.

İleri Düzey Senkronizasyon ve Çevrimdışı Çalışma Stratejileri

Uygulamanızın sadece yerel cihazda değil, bulut tabanlı bir yapıda da kusursuz çalışması için "Optimistic UI" (İyimser Arayüz) yaklaşımını benimsemelisiniz. Kullanıcı bir etkinlik eklediğinde, veritabanından onay gelmesini beklemeden arayüzü anında güncellemek, uygulamanın hız algısını ciddi oranda artırır.

Çevrimdışı Veri Senkronizasyonu İçin İş Akışı

Etkinliklerin internet kesintisi durumunda kaybolmaması için yerel veritabanı (SQLite veya Hive) ile uzak veritabanı (Firebase/PostgreSQL) arasında bir "Queue" (Kuyruk) mekanizması kurmalısınız. Aşağıdaki örnek, yerel bir değişikliğin nasıl kuyruğa alındığını ve senkronize edildiğini göstermektedir:


Future syncEvent(Event event) async {
  try {
    // Önce yerel veritabanına kaydet
    await localDatabase.insert(event);
    
    // İnternet bağlantısını kontrol et
    if (await isConnected()) {
      await remoteApi.postEvent(event);
      await localDatabase.markAsSynced(event.id);
    } else {
      // Bağlantı yoksa, senkronizasyon kuyruğuna ekle
      await syncQueue.add(event.id);
    }
  } catch (e) {
    debugPrint("Senkronizasyon hatası: $e");
  }
}

Uygulama Performansını Optimize Etme Teknikleri

Takvim uygulamalarında en büyük performans darboğazı, her tarih değişikliğinde tüm etkinliklerin yeniden hesaplanmasıdır. table_calendar gibi kütüphanelerde eventLoader fonksiyonunun gereksiz yere tetiklenmesini önlemek için Memoization veya Provider seçicilerini kullanmalısınız.

Büyük Veri Kümelerinde Listeleme Optimizasyonu

Eğer bir kullanıcıya ait binlerce etkinlik varsa, tüm veriyi belleğe yüklemek yerine "Pagination" (Sayfalama) veya "Lazy Loading" yöntemini uygulamalısınız. Sadece o an görüntülenen ayın verilerini getiren bir sorgu yapısı kurmak, uygulamanın RAM kullanımını %60'a kadar düşürebilir.

Yöntem Avantajı Kullanım Alanı
Lazy Loading Düşük RAM kullanımı Geçmişe dönük yıllarca süren etkinlikler
Debouncing Gereksiz API çağrısını önler Arama çubuğu ve filtreleme işlemleri
Isolate Kullanımı UI donmasını engeller Karmaşık tarih hesaplamaları ve veri ayrıştırma

Isolate ile Karmaşık İşlemleri Arka Plana Taşıma

Takvimde tekrarlanan etkinlikleri (her hafta Cuma günü gibi) hesaplamak CPU yoğun bir işlemdir. Bu hesaplamaları ana thread (UI thread) üzerinde yapmak, kaydırma sırasında takılmalara neden olur. Bu tür işlemleri compute fonksiyonu ile ayrı bir Isolate üzerinde çalıştırmak en profesyonel yaklaşımdır.


import 'package:flutter/foundation.dart';

// Karmaşık hesaplama fonksiyonu
List calculateRecurringDates(Map params) {
  // Uzun süren hesaplamalar burada yapılır
  return results;
}

// UI içerisinde kullanımı
final recurringDates = await compute(calculateRecurringDates, eventParams);

Bu optimizasyonlar, uygulamanızın düşük donanımlı cihazlarda bile 60 FPS (kare hızı) değerinde çalışmasını sağlayacak ve kullanıcı deneyimini en üst seviyeye taşıyacaktır.

Sonuç

Flutter ile profesyonel bir takvim ve etkinlik planlayıcı oluşturmak, doğru paket yönetimi ve temiz mimari ile oldukça erişilebilirdir. Bu rehberde, temel takvim kurulumundan veri kalıcılığına kadar kritik adımları tamamladık. Bir sonraki adım olarak, bu uygulamayı bir Firebase Backend'ine bağlayarak etkinliklerin cihazlar arası senkronize edilmesini sağlayabilir veya provider ya da riverpod gibi durum yönetimi kütüphaneleriyle uygulama mimarinizi daha ölçeklenebilir hale getirebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

On yıldır pratik ev çözümleri ve hayat kolaylaştıran teknikler üzerine içerik üretiyorum. Okuyucuların karmaşık süreçleri en basit adımlarla çözmelerine yardımcı oluyorum.

Yorumlar (0)

Yorum Yaz