Flutter & Mobil İle Dinamik Stok Takip Sistemi Nasıl Yapılır?

Flutter & Mobil İle Dinamik Stok Takip Sistemi Nasıl Yapılır?
Flutter & Mobil İle Dinamik Stok Takip Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın 2026 standartlarına uygun olduğundan emin olmalısınız. Flutter SDK'nın en güncel kararlı sürümünü kullandığınızdan emin olun. Ayrıca, arka plan veri yönetimi için Firebase projesi oluşturmanız ve "google-services.json" (Android için) veya "GoogleService-Info.plist" (iOS için) dosyalarını projenize eklemeniz gerekmektedir.

  • Flutter SDK 3.24 veya üzeri.
  • Dart 3.5 veya üzeri.
  • VS Code veya Android Studio (güncel eklentilerle birlikte).
  • Firebase hesabı ve Firebase CLI araçları.

Veri Modeli ve Ürün Yapısı

Dinamik bir sistemin temelinde güçlü bir veri yapısı yatar. Stok takip sistemimizde ürünleri temsil eden bir sınıf oluşturacağız. Bu sınıf, ürünün adı, mevcut stok miktarı ve birim fiyatı gibi temel bilgileri içerecektir.

class Product {
  final String id;
  final String name;
  final int quantity;
  final double price;

  Product({required this.id, required this.name, required this.quantity, required this.price});

  factory Product.fromMap(Map data, String documentId) {
    return Product(
      id: documentId,
      name: data['name'] ?? '',
      quantity: data['quantity'] ?? 0,
      price: (data['price'] ?? 0.0).toDouble(),
    );
  }
}

Yukarıdaki kod bloğu, Firebase'den gelen veriyi Dart nesnesine dönüştürmek için bir "factory" yapısı kullanır. Bu yöntem, veritabanı şemanızdaki değişikliklerin uygulama genelinde kolayca yönetilmesini sağlar.

Firebase Firestore ile Veri Entegrasyonu

Stok verilerini anlık olarak senkronize etmek için Cloud Firestore kullanacağız. Firestore, NoSQL tabanlı yapısı sayesinde mobil uygulamalarda dinamik veri güncellemeleri için en ideal çözümdür. Aşağıdaki örnekte, bir ürünün stok miktarını nasıl güncelleyeceğinizi görebilirsiniz.

import 'package:cloud_firestore/cloud_firestore.dart';

Future updateStock(String productId, int newQuantity) async {
  try {
    await FirebaseFirestore.instance.collection('products').doc(productId).update({
      'quantity': newQuantity,
    });
  } catch (e) {
    print("Stok güncellenirken hata oluştu: $e");
  }
}

Bu fonksiyon, Firestore'daki belirli bir dokümanı hedefleyerek sadece stok miktarını günceller. Hata yönetimi (try-catch bloğu), ağ kesintileri veya yetkilendirme sorunları durumunda uygulamanın çökmesini engellemek için kritik öneme sahiptir.

Dinamik Arayüz Tasarımı

Kullanıcıların stokları kolayca görebilmesi için StreamBuilder kullanarak veritabanındaki değişiklikleri anlık olarak ekrana yansıtan bir liste yapısı kurmalıyız. StreamBuilder, veri her değiştiğinde arayüzü otomatik olarak yeniden oluşturur.

StreamBuilder(
  stream: FirebaseFirestore.instance.collection('products').snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) return CircularProgressIndicator();
    return ListView.builder(
      itemCount: snapshot.data!.docs.length,
      itemBuilder: (context, index) {
        var doc = snapshot.data!.docs[index];
        return ListTile(
          title: Text(doc['name']),
          subtitle: Text('Stok: ${doc['quantity']}'),
        );
      },
    );
  },
)

Bu yapı, veritabanına yapılan her yeni ekleme veya güncellemenin kullanıcı ekranında anında görünmesini sağlar. Bu, stok takip sistemlerinin olmazsa olmaz "dinamik" özelliğidir.

Stok Yönetimi Yöntemleri Karşılaştırması

Stok takip sisteminizi kurarken seçebileceğiniz farklı yöntemler bulunmaktadır. İhtiyacınıza göre en uygun olanı seçmek için aşağıdaki tabloyu inceleyebilirsiniz.

Yöntem Avantajı Dezavantajı
Firebase Firestore Gerçek zamanlı senkronizasyon Büyük ölçekte maliyetli olabilir
Local SQLite Çevrimdışı çalışma desteği Cihazlar arası veri senkronizasyonu yok
REST API + SQL Tam kontrol ve düşük maliyet Geliştirme süreci daha uzun

Güvenlik ve Veri Doğrulama

Mobil uygulamalarda güvenlik, sadece kod seviyesinde değil, aynı zamanda veritabanı kurallarında da sağlanmalıdır. Firebase Firestore güvenlik kurallarını kullanarak, sadece yetkili kullanıcıların stok verilerini değiştirmesine izin vermelisiniz.

Kritik Güvenlik Uyarısı: Üretim ortamına geçmeden önce mutlaka Firestore "Security Rules" kısmını yapılandırın. Doğrulanmamış kullanıcıların veritabanına yazma yetkisi olmamalıdır. Ayrıca, kullanıcı girişlerini (Authentication) mutlaka entegre edin.

service cloud.firestore {
  match /databases/{database}/documents {
    match /products/{product} {
      allow read: if request.auth != null;
      allow write: if request.auth.token.admin == true;
    }
  }
}

Bu kurallar, veritabanınıza yetkisiz erişimi engeller. request.auth != null kontrolü, sadece oturum açmış kullanıcıların veri okuyabilmesini sağlar.

Stok Ekleme ve Form Yönetimi

Uygulamaya yeni ürün eklemek için TextFormField bileşenlerini içeren bir form yapısı kullanmalıyız. Verilerin veritabanına gönderilmeden önce doğrulanması (validation), hatalı stok girişlerini önler.

final _formKey = GlobalKey();
String _productName = '';

void _saveProduct() {
  if (_formKey.currentState!.validate()) {
    _formKey.currentState!.save();
    FirebaseFirestore.instance.collection('products').add({
      'name': _productName,
      'quantity': 0,
    });
  }
}

Bu kod, formun geçerli olup olmadığını kontrol eder ve ardından veriyi veritabanına ekler. Kullanıcı deneyimini artırmak için form gönderildikten sonra bir "Snack Bar" ile başarı mesajı göstermeyi unutmayın.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Ticari bir uygulamada kullanmadan önce veritabanı şemanızı, veri yedekleme stratejilerinizi ve güvenlik katmanlarınızı profesyonel bir yaklaşımla gözden geçirmeniz tavsiye edilir.

Sıkça Sorulan Sorular

Flutter ile stok takibinde çevrimdışı çalışma nasıl sağlanır?

Firebase Firestore'un "persistence" özelliğini etkinleştirerek, internet bağlantısı olmadığında verilerin yerel önbelleğe alınmasını ve bağlantı geldiğinde otomatik senkronize edilmesini sağlayabilirsiniz.

Stok verileri neden anlık güncellenmiyor?

Eğer StreamBuilder kullanıyorsanız ve güncelleme görmüyorsanız, Firestore koleksiyon yolunuzun doğru olduğundan ve veritabanı güvenlik kurallarının okuma izni verdiğinden emin olun.

Büyük ölçekli stoklar için Firestore yeterli mi?

Firestore, milyonlarca dokümanı yönetebilir. Ancak çok karmaşık ilişkisel sorgular yapmanız gerekiyorsa, SQL tabanlı bir veritabanı (PostgreSQL gibi) ile bir API katmanı kullanmak daha maliyet etkin olabilir.

Uygulama güvenliğini nasıl artırırım?

Firebase Authentication kullanarak kullanıcıları doğrulayın ve Firestore Security Rules ile veritabanı erişimlerini kısıtlayın. Asla API anahtarlarınızı doğrudan kod içinde açık metin olarak bırakmayın.

Performansı artırmak için ne yapmalıyım?

Liste görünümlerinde ListView.builder kullanarak sadece ekranda görünen öğelerin oluşturulmasını sağlayın (lazy loading). Büyük veri setlerinde "pagination" (sayfalama) yöntemini mutlaka uygulayın.

Mobil Uygulama İçin Barkod Okuma Entegrasyonu

Stok takip sistemlerinde manuel veri girişi, hata payını artırır ve süreci yavaşlatır. Flutter projelerinizde mobile_scanner paketini kullanarak, cihazın kamerasını bir barkod okuyucuya dönüştürebilir ve stok girişlerini saniyeler içinde gerçekleştirebilirsiniz.

Barkod Okuyucu Kurulumu ve Kullanımı

Öncelikle pubspec.yaml dosyanıza mobile_scanner: ^5.0.0 paketini ekleyin. Ardından, stok ekleme ekranınızda bir buton tetikleyerek okuyucu arayüzünü açan şu yapıyı kurabilirsiniz:


import 'package:mobile_scanner/mobile_scanner.dart';

// Barkod tarayıcıyı açan fonksiyon
void _openScanner(BuildContext context) {
  Navigator.of(context).push(MaterialPageRoute(
    builder: (context) => MobileScanner(
      onDetect: (capture) {
        final List barcodes = capture.barcodes;
        for (final barcode in barcodes) {
          debugPrint('Okunan Barkod: ${barcode.rawValue}');
          // Burada okunan barkodu stok formundaki ilgili alana atayın
          Navigator.pop(context);
        }
      },
    ),
  ));
}

Uygulama Performansını Optimize Etmek İçin İleri İpuçları

Stok takip sisteminiz büyüdükçe, Firestore'dan gelen verilerin işlenmesi ve arayüzün tepkiselliği kritik hale gelir. Uygulamanızın "donmadan" çalışması için aşağıdaki stratejileri uygulayın.

1. Veri Önbellekleme (Caching)

Firestore, varsayılan olarak çevrimdışı veri desteği sunar ancak büyük veri setlerinde yerel veritabanı sorgularını optimize etmek için PersistenceEnabled ayarını kontrol edin. Ayrıca, sık değişmeyen ürün bilgilerini shared_preferences veya hive gibi yerel bir veritabanında tutarak ağ trafiğini minimize edin.

2. İmaj Optimizasyonu

Stok kalemlerine eklenen ürün fotoğrafları, uygulamanın bellek kullanımını doğrudan etkiler. Fotoğrafları doğrudan Firestore'a kaydetmek yerine Firebase Storage'da tutun ve uygulamanızda gösterirken cached_network_image paketini kullanarak görselleri yerel önbelleğe alın.


// CachedNetworkImage kullanımı
CachedNetworkImage(
  imageUrl: "https://stok-resim-url.com/urun1.jpg",
  placeholder: (context, url) => CircularProgressIndicator(),
  errorWidget: (context, url, error) => Icon(Icons.error),
  width: 100,
  height: 100,
);

3. İndeksleme Stratejisi

Firestore sorgularınızda where ve orderBy ifadelerini aynı anda kullandığınızda, Firebase konsolu üzerinden "Composite Index" oluşturmanız istenecektir. İndeksleme yapılmayan sorgular, uygulamanın yavaş çalışmasına veya hata vermesine neden olur. Sorgularınızı oluştururken Firestore'un sağladığı hata mesajlarını takip ederek gerekli indeksleri mutlaka tanımlayın.

Performans Metriği Önerilen Yöntem
Liste Kaydırma ListView.builder ve Pagination
Görsel Yükleme CachedNetworkImage ve WebP formatı
Veri Sorgulama Firestore İndeksleri ve Limitli Sorgular

Sonuç

Flutter & Mobil ile dinamik stok takip sistemi oluşturmak, doğru araçları ve mimariyi seçtiğinizde oldukça verimli bir süreçtir. Bu rehberde, veri modellemeden gerçek zamanlı güncellemeler ve güvenlik kurallarına kadar temel taşları inceledik. Bir sonraki adım olarak, uygulamanıza barkod okuma özelliği ekleyerek stok girişlerini hızlandırabilir ve raporlama modülleri ile verilerinizi görselleştirebilirsiniz.

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

Yedi yıllık dijital içerik deneyimiyle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Pratik yaşam hackleri ve ev yönetimi konularında uzmanım.

Yorumlar (0)

Yorum Yaz