Flutter projelerinde klasörleme ve yapılandırma, uygulamanın ölçeğine ve ihtiyaçlarına göre önem taşır. API tabanlı projelerde modüler ve sürdürülebilir bir yapı kurmak uzun vadede projenin yönetimini kolaylaştırır. Aşağıda, güncel Flutter projelerinde kullanılan yaygın klasör yapıları ve mimari kalıpları açıklayarak seni yönlendireyim:
### 1. **Core/Temel Klasörleme**
— **`lib/`**: Ana kod klasörüdür. Altında mantıksal bir yapı oluşturarak projeni daha modüler hale getirebilirsin.
### 2. **Katmanlı Yapı**
Proje içerisinde model, servis, sayfa ve yardımcı fonksiyonlar gibi katmanlar arasında net bir ayrım sağlamak için şu yapılar kullanılabilir:
— **`models/`**: API’den gelen veya API’ye giden verilerin modelleri. Bu klasörde her model için bir `.dart` dosyası bulunur. Genellikle `json_serializable` paketini kullanarak JSON dönüşümleri sağlanır.
— **`services/`**: API çağrıları gibi işlevler için kullanılan servis katmanı. Burada, veri işlemleri, API’den veri çekme ve gönderme işlemleri gibi servis fonksiyonları yer alır. Dio veya Http paketlerini kullanarak bu katman üzerinden veri alışverişini sağlayabilirsin.
— **`pages/` veya `screens/`**: Uygulamanın farklı sayfalarını veya ekranlarını içeren klasördür. Sayfaları mantıksal gruplarına göre alt klasörlere bölebilirsin (örneğin, `authentication/`, `home/`, `settings/`).
— **`widgets/`**: Tekrar kullanılabilir UI bileşenlerini burada tutabilirsin. Butonlar, özel tasarımlar, formlar gibi bileşenleri ayrı olarak yönetmek, kod tekrarını azaltır.
— **`utils/` veya `helpers/`**: Yardımcı fonksiyonlar veya genel kullanılan sınıflar için bir klasör. Örneğin, tarih formatlama, API anahtarlarını yönetme, basit doğrulama fonksiyonları burada yer alabilir.
— **`constants/`**: Sabit değerleri (örn: renkler, yazı tipleri, API url’leri) tutmak için bu klasörü oluşturabilirsin.
### 3. **Mimari Kalıplar**
Flutter projelerinde kullanılan bazı popüler mimari yaklaşımlar:
— **BLoC (Business Logic Component) Pattern**: İş mantığını UI’dan ayırarak yönetir. Veriyi `Stream`ler aracılığıyla yönetir ve API çağrıları gibi işlemleri bloklar içinde yönetir. Proje büyüdükçe ölçeklenebilir bir yapı sağlar.
— Kullanılacak klasör yapısı:
— `bloc/` içinde `event.dart`, `state.dart`, `bloc.dart` dosyaları ile her bir modül için bir yapı oluşturulur.
- **Provider Pattern**: Basit veri paylaşımı ve durum yönetimi için kullanılır. Servisler ve veri modellerini widget ağacına bağlamak için `ChangeNotifier` veya `ValueNotifier` gibi sınıfları kullanır.
— Kullanılacak klasör yapısı:
— `providers/` içinde, her bir veriyi sağlayan sınıflar ve `models/` klasörü ile bağlantılı olarak kullanılabilir.
— **MVVM (Model-View-ViewModel)**: Model, View ve ViewModel katmanlarına bölünmüş bir yapıdır. UI, veriyi ve iş mantığını doğrudan kullanmaz, bunun yerine ViewModel aracılığıyla çalışır.
— Kullanılacak klasör yapısı:
— `view/`, `viewmodel/` ve `model/` klasörleri.
- **Clean Architecture**: Her katmanı (presentation, domain, data) net şekilde ayıran, bağımlılıkları minimize eden bir yapıdır. Genellikle büyük projelerde ölçeklenebilirliği artırır.
— Kullanılacak klasör yapısı:
— `presentation/`, `domain/`, `data/` olarak bölünebilir. Her biri altında ilgili alt klasörler (örneğin: `data/repositories`, `data/models`) oluşturulabilir.
### 4. **Resim Yükleme ve API Gönderimi**
— Resim gibi medya verilerini API’ye göndereceğin için `multipart/form-data` kullanman gerekecek. Bu işlevi `services/` klasöründeki bir servis aracılığıyla yönetebilirsin. Dio paketi bu konuda güçlü bir çözüm sağlar.
— Resim seçimi ve yükleme işlemleri için `image_picker` veya `file_picker` gibi paketler tercih edilebilir. Bu işlemleri yönetmek için bir `media/` veya `files/` klasörü de oluşturabilirsin.
### Örnek Klasör Yapısı:
```
lib/
│
├── models/
│ └── user_model.dart
│
├── services/
│ └── api_service.dart
│
├── pages/
│ └── home_page.dart
│
├── widgets/
│ └── custom_button.dart
│
├── utils/
│ └── date_formatter.dart
│
├── constants/
│ └── api_constants.dart
│
├── bloc/ (Eğer BLoC kullanacaksan)
│ └── user_bloc.dart
│
└── main.dart
```
Bu yapılar ve kalıplar, projenin büyüklüğüne ve ihtiyaçlarına göre değişebilir. Orta ölçekli bir proje için yukarıdaki yapı hem esneklik sağlar hem de iyi bir yönetilebilirlik sunar.