2021'de bir pazaryeri projesinde ilk kez Flutter'a ciddi para yatırırken açıkçası içimizde ufak bir kumar hissi vardı. Google bir gün fişini çeker mi, Dart diye bir dili ekibe öğretmek ne kadar sürer, App Store review'dan sorunsuz geçer mi... İki yıl sonra bugün, araç takipten pazaryerine onlarca Flutter uygulamasını yayında tutuyoruz ve "native mi cross-platform mı" sorusuna cevabımız netleşti: doğru proje için Flutter, üretim kalitesinde bir tercih. "Doğru proje için" kısmı önemli — yazının sonunda oraya geleceğim.
Maliyet tablosunda gerçekte ne değişiyor
Müşterilerin ilk sorusu hep maliyet, o yüzden oradan başlayayım. Klasik kurulumda iOS için Swift bilen bir ekip, Android için Kotlin bilen bir ekip gerekir; aynı özellik iki kere yazılır, iki kere test edilir, iki kere bakımı yapılır. Flutter'da tek Dart kod tabanı iki platformda da çalışıyor. Bizim projelerimizde geliştirme maliyeti pratikte yüzde 35-45 düşüyor.
Yüzde 50 değil — dikkat ederseniz. Çünkü "tek kod tabanı" hiçbir zaman "sıfır platform işi" demek değil. Store süreçleri ayrı, platform izin mekanizmaları ayrı, bildirim altyapıları farklı davranıyor, test cihaz matrisi yerinde duruyor. Bunu baştan dürüstçe söylemek gerekiyor; "yarı fiyatına iki uygulama" cümlesi kuran varsa teklifin gerisini dikkatli okuyun.
Maliyet kadar önemli ikinci kazanım hız: özellik tek yerde yazıldığı için iOS ve Android sürümleri arasında o bildik "Android'de var, iOS'a gelecek hafta geliyor" makası kapanıyor. Pazarlama ekipleri bunu çok seviyor.
Sürüm bakımı konusunda da iki yılın özeti olumlu: Flutter'ın kendi sürüm atlamaları bizde bugüne dek büyük kırılma yaratmadı. Çeyrekte bir, ayrılmış yarım günlük bir "framework güncelleme" rutinimiz var; paketler ve Flutter sürümü birlikte yükseltiliyor, testler koşuluyor, bitiyor. Bu rutini aksatan projelerde ise fatura birikiyor — bir yıl güncellenmemiş Flutter projesini bugüne taşımak, dört çeyreklik rutinin toplamından her zaman pahalı. (Web ve masaüstü hedeflerini soranlara: teknik olarak var, biz üretimde henüz mobil kadar gönül rahatlığıyla kullanmıyoruz.)
Kendi motorunu getiren framework
Flutter'ı diğer cross-platform yaklaşımlardan ayıran teknik detay şu: platformun hazır arayüz bileşenlerini kullanmıyor, her pikseli kendi çizim motoruyla kendisi çiziyor. Bunun pratik sonucu, tasarımın her cihazda birebir aynı görünmesi. Kurumsal kimliğine düşkün bir müşterimizin tasarım ekibi, ilk demo gününde iki telefonu yan yana koyup piksel piksel karşılaştırmıştı — fark bulamayınca ikna oldular. Markası güçlü işlerde bu tutarlılık ciddi bir satış argümanı.
Geliştirici tarafındaki karşılığı ise hot reload: kodda yaptığınız değişikliği, uygulamanın durumunu kaybetmeden saniyeler içinde cihazda görüyorsunuz. Kulağa küçük bir konfor gibi geliyor ama arayüz iterasyonunun temposunu değiştiriyor; tasarımcıyla geliştiricinin aynı masada oturup ekranı canlı canlı yonttuğu seanslar bizde artık standart. Eski usül "derle, kur, tıkla tıkla o ekrana gel" döngüsünü hatırlayan herkes farkı bilir.
Ekosistemin bu yılki tempoyu da hakkını vererek söyleyeyim: Dart 3'ün getirdiği dil sağlamlaştırmaları ve Flutter'ın yeni render motoru üzerindeki çalışmalar, Google'ın bu işin arkasında durduğunun işaretleri. 2021'deki "fişini çeker mi" endişemiz bugün gündemimizde değil; topluluk büyüyor, sürüm temposu düzenli, büyük şirketlerin üretim uygulamaları listesi uzuyor. Teknoloji seçiminde ekosistemin canlılığı, özellik listesinden daha iyi bir gösterge — ve bu gösterge yeşil.
Dart konusuna da değineyim: ekibe yeni dil öğretme korkumuz boş çıktı. Java, C# veya modern JavaScript bilen bir geliştirici Dart'a bir-iki haftada ısınıyor. Dilin kendisi kimsenin aşık olduğu bir dil değil belki, ama kimsenin nefret ettiği bir dil de değil — ve iş yazılımında bu, sanıldığından değerli bir özellik.
Bizi terleten senaryolar
Şimdi broşürlerde yazmayan kısım.
Donanıma çok yaslanan işlerde Flutter'ın "tek kod" vaadi kısmen bozuluyor. Araç takip projelerimizden birinde gelişmiş bir Bluetooth senaryosu vardı — arka planda kesintisiz bağlantı, özel protokol, agresif pil optimizasyonlarıyla boğuşma. Platform kanalları üzerinden hem iOS hem Android tarafında native kod yazmak zorunda kaldık. Flutter buna imkân veriyor, akış sorunsuz çalışıyor; ama o modül fiilen üç dilde yaşıyor (Dart, Kotlin, Swift) ve bakım maliyeti de ona göre. Benzer durum özel kamera işleme ve ağır görüntü senaryoları için de geçerli.
İkinci konu uygulama boyutu: Flutter motoru pakete dahil olduğu için boş bir uygulama bile native muadilinden birkaç MB büyük başlıyor. Çoğu proje için önemsiz; her MB'ın hesabının sorulduğu pazarlarda konuşulması gereken bir kalem.
Üçüncüsü paket ekosistemi. pub.dev her geçen ay zenginleşiyor ama JavaScript ekosisteminin genişliğinde değil; niş bir ihtiyaç için tek bir paket bulup onun da iki yıldır güncellenmediğini görmek yaşanan bir durum. Bizim edindiğimiz refleks: paket seçerken yıldız sayısından çok bakım sıklığına, açık issue'lara ve son commit tarihine bakmak. Kritik bir bağımlılığı sahipsiz bir pakete kurmak, cross-platform'un getirdiği tüm kazancı geri verebiliyor.
Bir zorluk kalemi daha, kimsenin broşüre yazmadığı: derleme ve dağıtım hattı. Tek kod tabanı olsa da çıktı iki ayrı pakettir ve iki mağazanın imzalama, sürümleme, inceleme süreçleriyle ayrı ayrı uğraşırsınız. Biz bu hattı otomatikleştirmeden yayına çıkmıyoruz artık — elle imzalanıp yüklenen sürümün, yanlış anahtar veya atlanan adım yüzünden geri çekildiği günleri yaşadık ve tekrarına niyetimiz yok.
Test tarafını da anmadan geçmeyeyim, çünkü Flutter'ın az konuşulan güçlü yanlarından biri: widget testleri. Arayüz bileşenlerini emülatör açmadan, saniyeler içinde test edebiliyorsunuz; bizim pazaryeri projelerinde kritik ekranların widget test kapsamı native dönemde hayal bile edemeyeceğimiz seviyede. State management tartışmasına da tek cümlelik pozisyonumuzu yazayım: ekibin bildiği ve disiplinle uyguladığı çözüm, teoride en şık çözümden iyidir — biz proje profiline göre seçiyor, proje içinde asla karıştırmıyoruz. (Bu konudaki din savaşlarına girmiyoruz; kahve molasında bile.)
Hangi projeye ne öneriyoruz
İki yılın damıttığı karar çerçevemiz şu. İçerik ve form ağırlıklı iş uygulamaları, pazaryerleri, saha ekip uygulamaları, takip ve yönetim panelleri — bu kategorilerde artık ilk önerimiz Flutter; maliyet ve hız avantajı bariz, teknik tavan yeterli. Oyunlar, AR deneyimleri ve donanımın iliklerine inen işler — orada hâlâ native diyoruz; platform kanallarıyla boğuşarak geçireceğiniz zaman, iki ayrı native uygulamanın maliyetine yaklaşıyor. Mevcut native uygulamaya modül eklemek ise duruma göre: Flutter'ın add-to-app desteği var ama entegrasyon maliyeti projeye göre çok değişiyor, genellemek yanlış olur.
Aklınızdaki mobil proje bu haritanın neresine düşüyor emin değilseniz, yarım saatlik bir ön görüşme genellikle netleştirmeye yetiyor. Teknoloji seçimini din savaşına çevirmeden, projenin gerçeklerine bakarak konuşuyoruz — iki yıl önceki kumar hissinin yerini bugün sakin bir mühendislik kararı aldı ve bu yazı, o kararın gerekçesiydi.