Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Flutter 3 ve Dart 3'te Gelenler: Impeller, Pattern'ler, Widget Previews, material_ui ve Sırada Ne Var
Dart 3.0 null safety'yi zorunlu yapıp record, pattern ve sealed class getirdi; 3.6–3.13 digit separator'dan primary constructor'a kadar küçük ama günlük kodu değiştiren adımlar attı. Flutter tarafında Impeller, SwiftPM, UIScene, Widget Previews ve 3.44–3.50 arasında Material'in material_ui paketine ayrılması var; dil sürümünün pubspec'ten geldiğini ve yükseltme pratiğini gerçek çıktılarla gösteriyoruz.
Flutter Uygulamasını Yayınlamak: Google Play ve App Store, Signing, Versioning, Flavor'lar ve CI
Flutter uygulaması iki mağazada da aynı yoldan geçer: release build, imzalama, test kanalı, inceleme ve kademeli yayın. Bookstore için sürüm numaralarını, --dart-define-from-file ile ortamları (ve neden secret taşıyamadıklarını), Android upload key ve Play App Signing'i, iOS imzalama ve TestFlight'ı, 2026 mağaza kurallarını ve GitHub Actions'ta imzalı App Bundle build'ini anlatıyoruz.
Flutter'da Test: Unit, Widget ve Integration Test, Fake Repository'ler ve Golden Test
Flutter'da testin omurgası fake repository'lerle yazılan unit ve widget testleridir; mock yalnız "bu çağrı yapıldı mı?" sorusu için, integration_test kritik akışlar için, golden test de tek platformda görsel değişiklikleri yakalamak için. Bookstore'un 86 testi, provider ve go_router'lı checkout akışı, mocktail'in registerFallbackValue tuzağı ve golden'ın platform farkıyla.
Flutter'da Local Storage ve Offline: shared_preferences, flutter_secure_storage, SQLite/drift ve Cache Stratejisi
Flutter'da küçük ve gizli olmayan ayarlar shared_preferences'a, token'lar flutter_secure_storage'a (iOS Keychain, Android Keystore), sorgulanan veri drift ile SQLite'a yazılır. Bookstore'un sepetini drift'e taşıyor, migration ve reactive query'yi deniyor, katalogu fresh cache, ağ ve stale cache sırasıyla internet yokken de gösteriyoruz; ViewModel'ler değişmeden.
Flutter'da API Entegrasyonu: http/dio, JSON Serialization, Repository ve ASP.NET Core Bookstore API'ye Bağlanmak
Flutter uygulamasını bir ASP.NET Core API'ye bağlamanın sağlam yolu, HTTP'yi tek bir ApiClient'ta toplamak (timeout, yalnız GET için retry, 401'de tek refresh), JSON'u domain modeline tek noktada çevirmek ve repository'yi değiştirip ViewModel'e dokunmamaktır. Bookstore API'nin SQLite kopyasına karşı gerçek yanıtlar, ProblemDetails eşlemesi, 10.0.2.2, cleartext ve CORS tuzaklarıyla.
Flutter'da Navigation: Navigator, go_router ile Declarative Routing, Deep Link ve Redirect ile Auth Guard
go_router'da context.go URL'ye gidip stack'i URL'nin hiyerarşisinden yeniden kurar, context.push ise mevcut stack'in üstüne ekler ve sonuç döndürebilir. Bookstore'a StatefulShellRoute ile her sekmesi kendi stack'ini tutan alt menüyü, /catalog/books/:isbn deep link'ini, refreshListenable ile kendiliğinden yeniden çalışan redirect auth guard'ını ve PopScope ile form kaybını önlemeyi gerçek test ve Chromium çıktılarıyla ekliyoruz.
Flutter'da State Management: setState'ten ChangeNotifier'a, provider ile DI ve Resmî Mimari Rehberi
Flutter'ın resmî mimari rehberi app state için View, ViewModel, Repository ve Service katmanlarını, tek yönlü veri akışını ve provider ile dependency injection'ı öneriyor. Bookstore'un sepetini ChangeNotifier tabanlı CartViewModel, Command ve sealed Result ile kuruyor, Selector'ın fiyat değişikliğinde gereksiz rebuild'i kestiğini gerçek test çıktılarıyla gösteriyor ve Riverpod, Bloc ve signals ile karşılaştırıyoruz.
Flutter'da Form ve Kullanıcı Girdisi: Form, TextFormField, Validation, Focus ve Klavye
Flutter'da form, Form ve GlobalKey<FormState> ile toplanır; validator null dönerse alan geçerlidir, sunucunun ProblemDetails hataları ise forceErrorText ile ilgili alana yazılır. Giriş ve teslimat adresi formlarında AutovalidateMode seçimini, FocusNode ile hatalı ilk alana odaklanmayı, input formatter'ların sınırını, klavye açılınca body'nin küçülmesini ve Angular Reactive Forms karşılıklarını gerçek test çıktılarıyla gösteriyoruz.
Flutter'da Theme ve Material 3: ThemeData, ColorScheme, Dark Mode, material_ui Paketi ve Cupertino
ColorScheme.fromSeed seed rengini olduğu gibi kullanmaz, ondan light ve dark için okunabilir kontrastlı ayrı paletler üretir; ColorScheme'de yeri olmayan değerler ThemeExtension ile temaya eklenir. Bookstore'un kahverengi temasını, dark mode'u, kendi renk token'larımızı, 3.50'de SDK içi Material'ın deprecated olmasıyla material_ui/cupertino_ui geçişini, adaptive widget'ları ve Türkçe locale ile intl biçimlendirmesini gerçek test çıktılarıyla anlatıyoruz.
Flutter'da Liste ve Grid: ListView.builder, Sliver'lar, Lazy Rendering ve Bookstore Katalog Ekranı
ListView'ın varsayılan constructor'ı da yalnız görünen satırları build eder ama bütün satır widget'larını önceden oluşturur; veriye bağlı listeler ListView.builder ya da sliver'larla kurulur, shrinkWrap ise bin satırın hepsini build ettirir. Bookstore katalog ekranını CustomScrollView, SliverAppBar ve liste/grid geçişiyle kuruyor, sayfalı yüklemeyi, pull-to-refresh'i, boş/hata durumlarını ve cacheWidth'in belleği 8 MB'tan 122 KB'a indirmesini gerçek test çıktılarıyla gösteriyoruz.
Flutter Layout: Constraint'ler Aşağı, Size'lar Yukarı — Row, Column, Expanded, Stack ve Overflow Hataları
Flutter'da parent child'ına bir constraint verir, child bu sınırın içinde kendi boyunu seçer, konumu parent belirler; Row içindeki bir Text sınırsız genişlik aldığı için taşar. Constraint'leri testte yazdırıyor, tight ve loose farkını, Expanded ve Flexible'ı, üç klasik layout hatasını ve LayoutBuilder ile telefon/tablet düzeni olan kitap detay ekranını gerçek çıktılarla gösteriyoruz.
Flutter'da Her Şey Widget: StatelessWidget, StatefulWidget, BuildContext ve Üç Ağaç
Flutter'da widget ekrandaki şeyin kendisi değil, immutable bir konfigürasyon: rebuild'de widget'lar yenilenir, element'ler ve render object'ler yerinde kalır, State element'te yaşar. BookCard ve FavoriteButton üzerinden State'in yaşam döngüsünü Angular karşılıklarıyla, const'un rebuild'i kesmesini, await sonrası mounted kontrolünü ve key olmadan state'in yanlış satıra kaymasını gerçek test çıktılarıyla gösteriyoruz.