Flutter & Mobil İle İleri Düzey İnce Ayarlı Uygulama İçi İstatistik Paneli Nasıl Yapılır?

Flutter & Mobil İle İleri Düzey İnce Ayarlı Uygulama İçi İstatistik Paneli Nasıl Yapılır?
Flutter & Mobil İle İleri Düzey İnce Ayarlı Uygulama İçi İstatistik Paneli 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 Flutter sürümü ile uyumlu çalışmak, performans ve güvenlik güncellemelerinden yararlanmanızı sağlar.

  • Flutter SDK 3.24 veya üzeri bir sürüm yüklü olmalıdır.
  • fl_chart paketi, veri görselleştirme için temel kütüphanemiz olacaktır.
  • provider veya riverpod gibi bir durum yönetimi kütüphanesi yapıya dahil edilmelidir.
  • Veri kaynağı için bir JSON API veya yerel bir SQLite veritabanı hazırlığı yapılmış olmalıdır.

Veri Modeli ve Veri Akışı Yönetimi

İstatistik panelinin temeli, verilerin nasıl modellendiği ve işlendiğidir. Veri tutarlılığı için "Data Transfer Object" (DTO) yapısını kullanmak, tip güvenliğini sağlar ve hata payını minimize eder.


class StatData {
  final String label;
  final double value;
  final DateTime timestamp;

  StatData({required this.label, required this.value, required this.timestamp});

  factory StatData.fromJson(Map json) {
    return StatData(
      label: json['label'],
      value: (json['value'] as num).toDouble(),
      timestamp: DateTime.parse(json['timestamp']),
    );
  }
}

Yukarıdaki kod bloğu, API'den gelen ham veriyi güvenli bir şekilde nesneye dönüştürür. Bu modelleme, uygulamanızın farklı bölümlerinde aynı veri yapısını kullanmanıza olanak tanır.

Grafik Bileşenlerinin Özelleştirilmesi

İleri düzey bir panel, standart grafiklerden daha fazlasını sunmalıdır. fl_chart kullanarak, kullanıcı etkileşimine duyarlı, özelleştirilmiş bir çizgi grafik oluşturalım.


LineChartData getChartData(List dataPoints) {
  return LineChartData(
    gridData: FlGridData(show: true, drawVerticalLine: false),
    titlesData: FlTitlesData(show: true),
    borderData: FlBorderData(show: true),
    lineBarsData: [
      LineChartBarData(
        spots: dataPoints.asMap().entries.map((e) {
          return FlSpot(e.key.toDouble(), e.value.value);
        }).toList(),
        isCurved: true,
        color: Colors.blueAccent,
        barWidth: 4,
      ),
    ],
  );
}

Bu fonksiyon, ham veriyi FlSpot listesine dönüştürerek grafik kütüphanesinin anlayacağı formata getirir. isCurved parametresi ile verilerin daha yumuşak ve estetik görünmesini sağlıyoruz.

Performans Optimizasyonu ve Veri Filtreleme

Büyük veri setleri ile çalışırken, arayüzün donmaması için veriyi "compute" fonksiyonu ile arka planda (Isolate) işlemek hayati önem taşır. Bu, ana iş parçacığının (main thread) serbest kalmasını sağlar.


import 'package:flutter/foundation.dart';

Future processData(List rawData) async {
  return compute(_parseAndFilter, rawData);
}

List _parseAndFilter(List data) {
  // Karmaşık filtreleme ve sıralama işlemleri burada yapılır
  return data.map((item) => StatData.fromJson(item)).toList();
}

compute kullanımı, ağır hesaplamaların kullanıcı deneyimini kesintiye uğratmasını engeller. Özellikle 1000'den fazla veri noktasıyla çalışırken bu yöntem zorunludur.

İstatistik Paneli Karşılaştırma Tablosu

Yöntem Avantaj Dezavantaj
Statik Grafik Hızlı render Etkileşimsiz
Dinamik (fl_chart) Yüksek özelleştirme Öğrenme eğrisi var
Canvas API Maksimum performans Çok karmaşık kod yapısı

Güvenlik ve Veri Gizliliği

Kritik Uyarı: Uygulama içi istatistikler hassas kullanıcı verileri içerebilir. API üzerinden veri çekerken her zaman HTTPS protokolünü kullanın ve verileri yerel cihazda saklarken flutter_secure_storage gibi şifreli depolama çözümlerini tercih edin. SQL Injection riskine karşı, yerel veritabanı sorgularınızda her zaman "parameterized queries" (parametreleştirilmiş sorgular) kullanın.

Dinamik Filtreleme ve Kullanıcı Etkileşimi

Kullanıcının veriyi "Günlük", "Haftalık" veya "Aylık" olarak görüntülemesi, panelin değerini artırır. Bu durumu yönetmek için StateNotifier veya benzeri bir yapı kullanmalısınız.


class StatProvider extends StateNotifier {
  StatProvider() : super([]);

  void filterByRange(DateTime start, DateTime end) {
    // Seçilen aralığa göre listeyi güncelle
    state = state.where((item) => item.timestamp.isAfter(start)).toList();
  }
}

Bu yapı, kullanıcı etkileşimine göre grafiğin anlık olarak güncellenmesini sağlar. StateNotifier, durum değişikliğini dinleyen tüm widget'ları otomatik olarak tetikler.

Hata Yönetimi ve Debug İpuçları

Geliştirme sırasında en sık karşılaşılan hata, boş veri setlerinin grafik kütüphanesini çökertmesidir. Her zaman veri boş mu kontrolü yapın.


Widget build(BuildContext context) {
  if (dataPoints.isEmpty) {
    return Center(child: Text("Henüz veri bulunamadı."));
  }
  return LineChart(getChartData(dataPoints));
}

Bu basit kontrol, uygulamanızın beklenmedik durumlarda çökmesini engeller. Ayrıca flutter_logs gibi paketleri kullanarak üretim ortamındaki hataları izleyebilirsiniz.

Sıkça Sorulan Sorular

İstatistik panelinde neden fl_chart tercih etmeliyim?

fl_chart, Flutter'ın render motoruyla tam uyumlu çalışır, yüksek performans sunar ve çok geniş bir özelleştirme yelpazesine sahiptir.

Büyük veri setlerinde uygulama donuyor, ne yapmalıyım?

Veri işleme süreçlerini compute fonksiyonu ile ana thread dışına taşıyın ve liste görünümlerinde ListView.builder kullanarak "lazy loading" (tembel yükleme) uygulayın.

Grafiklerin renklerini temaya göre nasıl değiştiririm?

Theme.of(context) kullanarak uygulamanın mevcut renk paletine erişebilir ve grafik renklerini dinamik olarak atayabilirsiniz.

Veri güvenliğini sağlamak için ne yapmalıyım?

API isteklerinde token tabanlı kimlik doğrulama (JWT) kullanın ve hassas verileri hiçbir zaman düz metin olarak cihazda tutmayın.

Panelin çevrimdışı çalışmasını nasıl sağlarım?

Hive veya SQLite kullanarak verileri yerel cihazda önbelleğe alın (caching). İnternet bağlantısı kesildiğinde yerel veriyi, bağlandığında ise API'den gelen güncel veriyi gösterin.

İleri Düzey Veri Görselleştirme İçin Özel Painter Kullanımı

Hazır kütüphanelerin sunduğu grafik seçeneklerinin ötesine geçmek istediğinizde, Flutter'ın CustomPainter sınıfı en güçlü aracınızdır. Özellikle karmaşık, standart dışı istatistiksel göstergeler (örneğin; radar grafikleri veya özel ısı haritaları) için kendi çizim mantığınızı oluşturmanız gerekir.

Aşağıdaki örnekte, basit bir veriyi dairesel bir ilerleme çubuğu üzerinde özelleştirilmiş bir şekilde çizen bir CustomPainter yapısını inceleyelim:

class CustomStatPainter extends CustomPainter {
  final double progress;
  final Color color;

  CustomStatPainter({required this.progress, required this.color});

  @override
  void paint(Canvas canvas, Size size) {
    final Paint paint = Paint()
      ..color = color
      ..strokeWidth = 10
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round;

    final Offset center = Offset(size.width / 2, size.height / 2);
    final double radius = (size.width / 2) - 5;

    canvas.drawArc(
      Rect.fromCircle(center: center, radius: radius),
      -pi / 2,
      2 * pi * progress,
      false,
      paint,
    );
  }

  @override
  bool shouldRepaint(covariant CustomStatPainter oldDelegate) {
    return oldDelegate.progress != progress;
  }
}

İstatistik Panellerinde Bellek Yönetimi ve İleri Optimizasyon

Büyük veri setleri ile çalışırken, grafiklerin her karede (frame) yeniden oluşturulması (rebuild) ciddi performans kayıplarına yol açar. Bellek sızıntılarını önlemek ve akıcı bir deneyim sunmak için şu stratejileri uygulayın:

  • RepaintBoundary Kullanımı: Karmaşık çizimlerin bulunduğu widget'ları RepaintBoundary ile sarmalayarak, sadece veri değiştiğinde yeniden çizilmelerini sağlayın.
  • Veri Örnekleme (Downsampling): Binlerce veri noktasını aynı anda çizmek yerine, LTTB (Largest-Triangle-Three-Buckets) gibi algoritmalar kullanarak veri setini görsel olarak anlamlı olacak şekilde küçültün.
  • Isolate Kullanımı: JSON verisini parse etme veya karmaşık istatistiksel hesaplamaları (standart sapma, regresyon vb.) ana UI thread'i üzerinde yapmayın. Bu işlemleri compute fonksiyonu ile arka plan izolelerinde (isolate) gerçekleştirin.

İzole (Isolate) ile Hesaplama Örneği

import 'package:flutter/foundation.dart';

// Ağır hesaplama fonksiyonu
Map calculateStatistics(List rawData) {
  double sum = rawData.reduce((a, b) => a + b);
  return {'average': sum / rawData.length};
}

// UI içerisinde kullanımı
void updateStats(List data) async {
  final result = await compute(calculateStatistics, data);
  setState(() {
    averageValue = result['average']!;
  });
}

Dağıtım (Deployment) Öncesi İstatistik Paneli Testleri

Uygulamanızın istatistik paneli, farklı ekran boyutlarında ve cihaz yoğunluklarında tutarlı çalışmalıdır. Dağıtım öncesi şu test adımlarını mutlaka tamamlayın:

  1. Widget Testleri: Grafik bileşenlerinin doğru veri girişleriyle doğru çıktıları verip vermediğini tester.pumpWidget ile doğrulayın.
  2. Entegrasyon Testleri: API'den gelen hatalı veya boş veri setlerinin (null safety sınırları dahilinde) paneli çökertmediğinden emin olun.
  3. Cihaz Testleri: Düşük donanımlı cihazlarda Flutter DevTools üzerinden "Performance Overlay"i açarak frame düşüşlerini (jank) gözlemleyin.

Sonuç

Flutter ile ileri düzey bir istatistik paneli geliştirmek, doğru mimariyi kurmakla başlar. Veri modelleme, performanslı işleme ve kullanıcı etkileşimi üzerine odaklandığınızda, profesyonel kalitede sonuçlar almanız kaçınılmazdır. Bu rehberde öğrendiğiniz teknikleri, uygulamanızın özel ihtiyaçlarına göre genişleterek daha karmaşık analiz araçları oluşturabilirsiniz.

Bir sonraki adımda, bu paneli Firebase Analytics veya kendi backend servislerinizle entegre ederek verileri bulut üzerinde senkronize etmeyi deneyebilirsiniz. Başarılar dileriz.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve evde pratik tamirat üzerine uzmanım. Detaylı rehberlerimle herkesin teknik becerilerini geliştirmesini amaçlıyorum.

Yorumlar (0)

Yorum Yaz