Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Flutter Nedir? Tek Codebase, Kendi Rendering Engine'i ve .NET MAUI / React Native / Native Karşısında Yeri
Flutter, platformun native kontrollerini kullanmak yerine her pikseli kendi engine'iyle (Impeller) çizen, tek Dart codebase'inden Android ve iOS uygulaması üreten bir UI toolkit'i. Katmanlarını, Dart'ın geliştirmede JIT ve release'te AOT derlenmesini gerçek ölçümle gösteriyor, .NET MAUI, React Native ve native seçenekleriyle karşılaştırıp Flutter'ın ne zaman seçilmeyeceğini anlatıyoruz.
Flutter Kurulumu ve İlk Proje: SDK, Android Studio, Xcode, Emulator, flutter doctor ve Hot Reload
Flutter'ı Windows'ta Android için, macOS'ta Android ve iOS için kurmak, flutter doctor çıktısını okumak ve bookstore_app'i material_ui ile oluşturmak bu yazının konusu. Hot reload'un state'i koruyup hot restart'ın sıfırladığını gerçek bir koşuyla gösteriyor, pubspec.yaml'ı csproj ve package.json ile eşliyor, emulator olmadan widget testi ve web build'iyle doğrulama yapıyoruz.
C# Geliştiricisi için Dart 1: Tipler, Null Safety, Collection'lar, Function'lar ve Record'lar
Dart'ın null safety'si C#'tan farklı olarak sound: nullable bir değeri kontrol etmeden kullanmak uyarı değil derleme hatası, ve non-nullable bir değişken çalışma anında da null olamaz. C# bilen okur için var/final/const farkını, const'un canonical instance üretmesini, collection if/for ve null-aware element'leri, named parametreleri ve record'ları gerçek çıktılarla anlatıyor, Bookstore'un Book ve Author modellerini yazıyoruz.
C# Geliştiricisi için Dart 2: Class'lar, Primary Constructor, Mixin, Sealed Class ve Pattern Matching
Dart'ta sealed bir hiyerarşi üzerindeki switch, yeni bir alt tip eklendiğinde derlenmez ve eksik durumu adıyla gösterir; value equality ise == ve hashCode yazılmadan gelmez. Constructor çeşitlerini, Dart 3.13 primary constructor'larının C# 12'den farkını, class modifier'larını, mixin ve extension type'ları gerçek çıktılarla anlatıyor, Bookstore'un OrderStatus ve Money tiplerini yazıyoruz.
Dart'ta Asenkron Programlama: Future, async/await, Stream ve Isolate
Dart tek thread'li bir event loop'ta çalışır: async/await işi arka plana taşımaz, ağır bir iş UI'ı dondurur ve gerçek paralellik için ayrı bellekli isolate gerekir. Future'ı C#'taki Task ile, Stream'i IAsyncEnumerable ile karşılaştırıyor; 20 MB'lık bir JSON'un ana isolate'te frame'leri durdurduğunu, Isolate.run ile durdurmadığını ölçüyor, await edilmeyen Future'ın hatasının nasıl kaybolduğunu 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.
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 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'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 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 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 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.