Flutter Geliştirici Mülakat Soruları v2.0 🎯

mikailkose
8 min readOct 30, 2024

--

Herkese Selamlar, bugün sizlere ilk versiyonda paylaştığım Flutter Geliştici mülakat sorularının güncellenmiş ve genişletilmiş ikinci versiyonundan bahsedeceğim.

Flutter’da Provider türlerini ve kullanım amaçlarını açıklayınız.

Provider (Temel Provider)

  • Flutter’daki en temel provider türüdür
  • Herhangi bir değeri doğrudan dışa aktarır
  • Basit, değişmeyen veriler için idealdir
  • Widget ağacında veri paylaşımı için kullanılır

ListenableProvider

  • Listenable tipindeki nesneler için özelleştirilmiş bir provider’dır
  • Nesne değişikliklerini dinler ve bağımlı widget’ları günceller
  • Dinamik veri değişimlerini yönetmek için kullanılır
  • Manuel olarak değişiklikleri bildirme yeteneği sunar

ChangeNotifierProvider

  • ChangeNotifier sınıfından türetilen nesneler için tasarlanmıştır
  • Otomatik dispose mekanizması içerir
  • State management için en yaygın kullanılan provider türüdür
  • Karmaşık durum yönetimi gerektiren senaryolarda tercih edilir

ValueListenableProvider

  • ValueListenable nesnesini dinler ve sadece value değerini dışa açar
  • Spesifik bir değerin değişimini takip etmek için kullanılır
  • Daha hafif ve odaklanmış bir state management çözümüdür
  • Tek bir değerin değişimini izlemek için idealdir

StreamProvider

  • Bir Stream’i dinler ve yayınlanan son değeri dışa aktarır
  • Gerçek zamanlı veri akışı yönetimi için kullanılır
  • Firebase gibi stream tabanlı servislerde sıkça kullanılır
  • Sürekli güncellenen veriler için uygundur
  • FutureProvider
  • Bir Future işleminin sonucunu yönetir
  • Asenkron veri yükleme işlemleri için kullanılır
  • API çağrıları gibi tek seferlik asenkron işlemler için idealdir
  • Future tamamlandığında bağımlı widget’ları otomatik günceller

Flutter’da InheritedWidget nedir? Kullanım amaçları ve yaygın örneklerini açıklayınız.

InheritedWidget, Flutter’da veri paylaşımını sağlayan ve widget ağacı boyunca belirli verileri iletmek için kullanılan bir widget türüdür. Bu widget, üst widgetlar tarafından oluşturulur ve alt widgetlar tarafından “of” metodu kullanılarak erişilir. InheritedWidget, alt widgetlerin güncellenmesi gerekip gerekmediğini kontrol etmek için “updateShouldNotify” metoduyla birlikte gelir. Bu sayede uygulama durumu veya ayarları gibi verileri geniş bir widget ağacı boyunca paylaşmak ve bu verilere bağımlı widgetlerin otomatik olarak yeniden oluşturulmasını sağlamak mümkün olur.

Yaygın Kullanım Örnekleri:

Theme:

  • Uygulama genelinde tema verilerini yönetir
  • Renk şemaları, yazı tipleri ve stilleri paylaşır
  • Theme.of(context) ile erişim sağlanır

Localization:

  • Çoklu dil desteği için kullanılır
  • Metin çevirilerini yönetir
  • Lokalizasyon verilerine kolay erişim sağlar

MediaQuery:

  • Ekran boyutu, piksel oranı gibi cihaz bilgilerini paylaşır
  • Responsive tasarım için gerekli verileri sağlar
  • MediaQuery.of(context) ile kullanılır

Kullanım Avantajları:

  • Kod tekrarını azaltır
  • Merkezi veri yönetimi sağlar
  • Widget ağacında verimli veri paylaşımı sunar
  • Otomatik widget güncelleme mekanizması içerir

Dikkat Edilmesi Gerekenler:

  • Gereksiz rebuild işlemlerinden kaçınmak için doğru kullanılmalıdır
  • updateShouldNotify metodu dikkatli implement edilmelidir
  • Performans için gereksiz widget güncellemelerinden kaçınılmalıdır
  • Context yapısına dikkat edilmelidir

Bu yapı, modern Flutter uygulamalarında state management ve veri paylaşımı için temel oluşturur ve birçok Flutter widget’ının (Theme, MediaQuery, Localization gibi) altyapısını oluşturur.

Flutter’da App Lifecycle durumlarını ve kullanım amaçlarını açıklayınız.

App Lifecycle, Flutter uygulamasının yaşam döngüsünü yöneten dört temel durumdan oluşur:

AppLifecycleState.paused (Duraklatıldı):

  • Uygulama arka planda çalışır
  • Kullanıcı arayüzü görünmez durumdadır
  • Örnek Kullanım: Veri kaydetme, ağ bağlantılarını durdurma

AppLifecycleState.resumed (Devam Ediyor):

  • Uygulama ön plandadır
  • Kullanıcı ile etkileşim halindedir
  • Örnek Kullanım: Verileri yenileme, bağlantıları tekrar başlatma

AppLifecycleState.inactive (Pasif):

  • Uygulama geçici olarak etkileşime kapalıdır
  • Telefon araması veya bildirim paneli açıldığında oluşur
  • Örnek Kullanım: Geçici veri kaydetme, hassas verileri gizleme

AppLifecycleState.detached (Ayrık):

  • Uygulama yerel olarak başlatılmıştır
  • Widget ağacı henüz yüklenmemiştir
  • Örnek Kullanım: İlk yapılandırma, başlangıç verilerini yükleme

Önemli Notlar:

  • Bu durumlar uygulamanın farklı senaryolardaki davranışını yönetir
  • Kaynak yönetimi için önemlidir
  • Veri kaybını önlemek için kullanılır
  • Uygulama performansını optimize etmeye yardımcı olur

Kullanım Alanları:

  • Veri kaydetme/yükleme işlemleri
  • Bellek yönetimi
  • Ağ bağlantı durumları
  • Medya oynatma kontrolü
  • Animasyon yönetimi

Flutter’da Widget Lifecycle metodlarını sırasıyla açıklayınız ve kullanım amaçlarını belirtiniz.

Flutter’da Widget Lifecycle, bir widget’ın yaşam döngüsünü yöneten sekiz temel metoddan oluşur:

createState():

  • StatefulWidget oluşturulduğunda ilk çağrılan metoddur
  • State nesnesini oluşturur
  • StatefulWidget’ın alt sınıfları tarafından override edilmelidir

initState():

  • State nesnesi oluşturulduktan sonra ilk çağrılan metoddur
  • Bir kez çalışır
  • Kullanım alanları:
  • Veri çekme işlemleri
  • Animasyon başlatma
  • Listener ekleme
  • Değişken başlatma

didChangeDependencies():

  • State nesnesinin bağımlılıkları değiştiğinde çağrılır
  • InheritedWidget değişikliklerini yakalar
  • Tema veya dil değişiklikleri gibi durumlarda kullanılır

build():

  • Widget’ın görsel arayüzünü oluşturur
  • Her state değişiminde tekrar çağrılır
  • Widget ağacını oluşturur ve günceller

didUpdateWidget():

  • Widget yenilendiğinde çağrılır
  • Eski ve yeni widget karşılaştırması yapılır
  • Widget güncelleme mantığı burada yönetilir

setState():

  • State nesnesini güncellemek için kullanılır
  • build metodunun tekrar çağrılmasını tetikler
  • UI güncellemelerini yönetir

deactivate():

  • Widget geçici olarak ağaçtan çıkarıldığında çağrılır
  • Widget’ın durumu korunur
  • Geçici devre dışı bırakma işlemlerini yönetir

dispose():

  • Widget tamamen yok edilirken çağrılır
  • Kullanım alanları:
  • Bellek temizleme
  • Listener’ları kaldırma
  • Stream aboneliklerini iptal etme
  • Timer’ları durdurma

Önemli Notlar:

  • Metodlar belirli bir sırayla çağrılır
  • Her metodun özel bir amacı vardır
  • Doğru kullanım memory leak’leri önler
  • Performans optimizasyonu için önemlidir

Pratik Kullanım:

  • Veri yönetimi
  • Kaynak yönetimi
  • UI güncellemeleri
  • State yönetimi
  • Bellek optimizasyonu

Dart dilindeki değişken tiplerini açıklayınız ve kullanım amaçlarını örneklerle belirtiniz.

Dart dilinde kullanılan temel değişken tipleri şunlardır:

var:

  • Tip belirtilmeden değişken tanımlamak için kullanılır
  • Değer tipi otomatik belirlenir
  • Sonradan değiştirilebilir
  • Kod okunabilirliği için dikkatli kullanılmalıdır

String:

  • Metin verilerini tutmak için kullanılır
  • Metinsel değerleri temsil eder
  • Açık tip tanımlaması gerektiğinde tercih edilir

final:

  • Bir kez değer atanabilen değişkenlerdir
  • Runtime’da değer atanabilir
  • Değeri sonradan değiştirilemez
  • Güvenli programlama için kullanılır

const:

  • Derleme zamanında sabit değer atanır
  • Değeri sonradan değiştirilemez
  • Performans optimizasyonu sağlar
  • Sabit değerler için kullanılır

dynamic:

  • Türü belirsiz değişkenler için kullanılır
  • Her türden değer alabilir
  • Type-safety açısından risklidir
  • Dikkatli kullanılması gerekir

object:

  • Soyut veri tipidir
  • Her türden değer alabilir
  • Tip güvenliği dynamic’e göre daha fazladır
  • Genel amaçlı kullanım için uygundur

late:

  • Geç başlatılacak değişkenler için kullanılır
  • İlk kullanımda değer atanır
  • Null safety için önemlidir
  • Lazy loading senaryolarında kullanılır

Önemli Noktalar:

  • Tip güvenliği için açık tip tanımlaması önerilir
  • const ve final performans optimizasyonu sağlar
  • late null safety için önemli bir özelliktir
  • var kullanımı kod okunabilirliğini etkileyebilir

Kullanım Önerileri:

  • Sabit değerler için const kullanın
  • Değişmeyecek değerler için final kullanın
  • Tip belirsizliği varsa object tercih edin
  • Geç başlatma için late kullanın
  • dynamic kullanımından mümkünse kaçının

Flutter/Dart’ta Generics nedir? Kullanım amacı ve önemini açıklayınız.

Generics, Dart dilinde tip güvenliği sağlayan ve kodun yeniden kullanılabilirliğini artıran bir programlama özelliğidir.

Temel Özellikleri:

Tip Güvenliği:

  • Derleme zamanında tip kontrolü sağlar
  • Runtime hatalarını önler
  • Kod güvenilirliğini artırır

Yeniden Kullanılabilirlik:

  • Farklı veri tipleriyle çalışabilen kod yazılmasını sağlar
  • Kod tekrarını önler
  • Bakım kolaylığı sağlar

Esneklik:

  • Farklı tiplerde çalışabilen sınıflar oluşturulabilir
  • Dinamik tip desteği sunar
  • Kod uyarlanabilirliğini artırır

Kullanım Alanları:

Koleksiyonlar:

  • List<T>
  • Map<K,V>
  • Set<T>

Özel Sınıflar:

  • Repository sınıfları
  • Servis sınıfları
  • Utility sınıfları

Avantajları:

  • Daha güvenli kod yazımı
  • Daha az kod tekrarı
  • Daha iyi hata yakalama
  • Daha kolay bakım
  • Daha esnek yapılar

Önemli Noktalar:

  • Tip güvenliği çok önemlidir
  • Runtime hatalarını azaltır
  • Kod okunabilirliğini artırır
  • Performans iyileştirmesi sağlar
  • Modern programlamanın önemli bir parçasıdır

Derleyici (Compiler) nedir? İhtiyaç duyulma sebeplerini açıklayınız.

Derleyici, yüksek seviyeli programlama dilinde yazılmış kaynak kodunu, düşük seviyeli makine diline çeviren yazılım aracıdır.

Derleyiciye İhtiyaç Duyulma Sebepleri:

Performans:

  • Makine diline doğrudan çeviri sağlar
  • Daha hızlı çalışma imkanı sunar
  • Kaynak kodunu optimize eder

Bağımsızlık:

  • Farklı platformlarda çalışabilme
  • Donanımdan bağımsız kod yazabilme
  • Platform taşınabilirliği sağlar

Gizlilik ve Güvenlik:

  • Kaynak kodunu makine diline çevirir
  • Kodun tersine mühendisliğini zorlaştırır
  • Fikri mülkiyet koruması sağlar

Optimizasyon:

  • Kod verimliliğini artırır
  • Bellek kullanımını optimize eder
  • Çalışma süresini iyileştirir

Hata Kontrolü:

  • Derleme zamanında hata tespiti
  • Kod kalitesini artırır
  • Güvenli kod üretimini sağlar

Önemli Noktalar:

  • Kaynak kodu makine diline çevirir
  • Performans optimizasyonu sağlar
  • Kod güvenliğini artırır
  • Platform bağımsızlığı sunar
  • Hata tespitini kolaylaştırır

Kullanım Alanları:

  • Uygulama geliştirme
  • Sistem programlama
  • Oyun geliştirme
  • Gömülü sistemler
  • Mobil uygulama geliştirme

Dart dilinde JIT (Just-In-Time) ve AOT (Ahead-Of-Time) derleyicilerini karşılaştırarak açıklayınız.

1. JIT (Just-In-Time) Derleyici:

Özellikler:

  • Sanal makineye (VM) bağlı çalışır
  • Hot Reload özelliğini destekler
  • Geliştirme sürecinde kullanılır

Avantajları:

  • Hızlı kod güncelleme
  • Kısmi derleme imkanı
  • Geliştirme sürecini hızlandırır
  • Anlık değişiklikleri görebilme

2. AOT (Ahead-Of-Time) Derleyici:

Özellikler:

  • Sanal makineden bağımsızdır
  • Tüm kod önceden derlenir
  • Üretim ortamında kullanılır

Avantajları:

  • Daha iyi performans
  • Daha hızlı başlangıç süresi
  • Daha az bellek kullanımı
  • Optimize edilmiş çalışma

Karşılaştırma:

Derleme Zamanı:

  • JIT: Çalışma zamanında
  • AOT: Önceden derleme

Kullanım Alanı:

  • JIT: Geliştirme ortamı
  • AOT: Üretim ortamı

Performans:

  • JIT: Geliştirme odaklı
  • AOT: Çalışma zamanı odaklı
  • Esneklik:
  • JIT: Yüksek (Hot Reload)
  • AOT: Düşük (Tam derleme)

Önemli Notlar:

  • JIT geliştirme sürecini hızlandırır
  • AOT uygulama performansını artırır
  • Her ikisi de farklı amaçlara hizmet eder
  • Flutter her ikisini de destekler

Dart dilinde primitive (ilkel) veri tipleri nelerdir ve ne amaçla kullanılırlar?

Dart dilinde 5 temel primitive veri tipi bulunur:

int:

  • Tam sayı değerlerini tutar
  • Örnek: 1, 2, -3, 100
  • Bellek boyutu: 64 bit
  • Matematiksel işlemler için kullanılır

double:

  • Ondalıklı sayıları tutar
  • Örnek: 1.5, 3.14, -0.5
  • Hassas hesaplamalar için kullanılır
  • Bellek boyutu: 64 bit

String:

  • Metinsel verileri tutar
  • Örnek: “Merhaba”, ‘Dart’
  • Metin işlemleri için kullanılır
  • Çift veya tek tırnak ile tanımlanır

bool:

  • Mantıksal değerleri tutar
  • true veya false değeri alır
  • Koşul ifadelerinde kullanılır
  • Kontrol yapıları için önemlidir

num:

  • Sayısal değerleri tutar
  • int ve double’ın üst sınıfıdır
  • Hem tam sayı hem ondalıklı sayı tutabilir
  • Genel sayısal işlemler için kullanılır

Önemli Noktalar:

  • Her tipin kendine özgü işlemleri vardır
  • Tip dönüşümleri yapılabilir
  • Null safety kurallarına tabidirler
  • Performans için önemlidirler

Kullanım Alanları:

  • Matematiksel işlemler
  • Veri depolama
  • Koşul kontrolleri
  • Temel programlama işlemleri
  • Veri manipülasyonu

Dart dilinde Never türü nedir ve hangi durumlarda kullanılır? Açıklayınız.

Never türü, bir işlemin veya fonksiyonun asla normal bir şekilde tamamlanmayacağını belirten özel bir tiptir.

Kullanım Amaçları:

Hata Fırlatma:

  • Exception durumlarında
  • Hata yönetiminde
  • Uygulama sonlandırma durumlarında

Sonsuz Döngüler:

  • Sürekli çalışan işlemlerde
  • Server processlerinde
  • Background işlemlerde

Kontrol Mekanizmaları:

  • Type checking işlemlerinde
  • Null kontrollerinde
  • Validasyon işlemlerinde

Önemli Özellikleri:

  1. Tip Güvenliği:
  • Derleme zamanında kontrol sağlar
  • Runtime hatalarını önler
  • Kod güvenliğini artırır

Kod Kalitesi:

  • Daha iyi hata yönetimi
  • Daha anlaşılır kod yapısı
  • Daha güvenilir uygulamalar

Kullanım Örnekleri:

  • Kritik hata durumları
  • Sistem çökme senaryoları
  • Uygulama sonlandırma işlemleri
  • Zorunlu hata fırlatma durumları

Avantajları:

  • Daha iyi tip güvenliği
  • Daha net kod yapısı
  • Daha iyi hata yönetimi
  • Derleme zamanı kontrolleri
  • Daha güvenilir uygulamalar

Dart dilinin thread yapısını açıklayınız ve Isolate kavramını anlatınız.

Dart’ın Thread Yapısı:

Single Thread:

  • Dart varsayılan olarak tek thread üzerinde çalışır
  • Event loop modeli kullanır
  • Ana thread “Main Thread” olarak adlandırılır

Isolate Kavramı:

  • Çoklu thread benzeri yapı sağlar
  • Her isolate kendi hafıza alanına sahiptir
  • Isolate’ler arası iletişim mesajlaşma ile olur

Isolate Kullanım Amaçları:

Performans İyileştirme:

  • Ağır işlemleri ana threadden ayırma
  • CPU yoğun işlemleri paralel çalıştırma
  • Uygulama tepkisini artırma

Kaynak Yönetimi:

  • Bellek izolasyonu sağlama
  • Kaynakları etkili kullanma
  • Memory leak önleme

Önemli Noktalar:

Event Loop:

  • Asenkron işlemleri yönetir
  • UI tepkisini korur
  • Task sıralaması yapar

İzolasyon:

  • Her isolate bağımsızdır
  • Paylaşılan bellek yoktur
  • Güvenli parallel işlem sağlar

Avantajları:

  • Basit thread modeli
  • Güvenli parallel işlem
  • Etkili kaynak kullanımı
  • Kolay hata yönetimi
  • Performans optimizasyonu

Flutter’da RepaintBoundary nedir? Kullanım amacı ve faydalarını açıklayınız.

RepaintBoundary, Flutter’da widget ağacında yeniden çizim işlemlerini optimize eden özel bir widgettır.

Çalışma Prensibi:

İzolasyon:

  • Widget ağacında bir sınır oluşturur
  • Yeniden çizim alanını sınırlar
  • Sadece değişen bölgeleri günceller

Performans İyileştirmesi:

  • Gereksiz yeniden çizimleri önler
  • Render işlemlerini optimize eder
  • Uygulama performansını artırır

Kullanım Nedenleri:

Optimize Render:

  • Seçili alanların yeniden çizimi
  • Kaynak kullanımını azaltma
  • Daha hızlı ekran güncellemesi

Verimlilik:

  • Gereksiz işlemleri engeller
  • GPU kullanımını optimize eder
  • Pil tüketimini azaltır

Avantajları:

  • Daha iyi performans
  • Optimize edilmiş render işlemleri
  • Düşük kaynak kullanımı
  • Hızlı ekran güncellemeleri
  • Etkili widget yönetimi

Kullanım Alanları:

  • Animasyonlu widgetlar
  • Sık güncellenen UI elemanları
  • Karmaşık widget ağaçları
  • Performans kritik bölümler
  • Dinamik içerikler

Flutter’da Intrinsic widget’lar nedir? Kullanım amaçları ve dikkat edilmesi gereken noktaları açıklayınız.

Intrinsic widget’lar, child widget’ların boyutlarını analiz ederek en uygun boyutu belirleyen özel Flutter widget’larıdır.

Çalışma Prensibi:

Boyut Belirleme:

  • Child widget’ları analiz eder
  • En büyük boyutu tespit eder
  • Optimum boyutu hesaplar

Önbellekleme:

  • Ölçülen boyutları kaydeder
  • Tekrar hesaplama ihtiyacını azaltır
  • Performans optimizasyonu sağlar

Dikkat Edilmesi Gerekenler:

Performans Etkisi:

  • İki kez widget yerleşimi yapar
  • Derin ağaç yapılarında maliyetlidir
  • Gereksiz kullanımdan kaçınılmalıdır

Kullanım Senaryoları:

  • Sadece gerekli durumlarda kullanılmalı
  • Basit yapılarda tercih edilmeli
  • Alternatif çözümler değerlendirilmeli

Avantajları:

  • Otomatik boyut ayarlama
  • Dinamik layout yönetimi
  • Önbellekleme özelliği
  • Esnek tasarım imkanı

Dezavantajları:

  • Yüksek performans maliyeti
  • Karmaşık hesaplamalar
  • Derin ağaçlarda verimsizlik
  • Fazla kaynak kullanımı

Kullanım Önerileri:

  • Gerekli durumlarda kullanın
  • Performans etkisini göz önünde bulundurun
  • Alternatif çözümleri değerlendirin
  • Basit yapılarda tercih edin
  • Test ederek kullanın

Flutter’da ShrinkWrap ve SliverList kullanımını karşılaştırarak, iç içe ListView’larda performans optimizasyonunu açıklayınız.

İç içe ListView’lar kullanırken “viewports receiving unbounded dimensions” hatası ve performans sorunları ortaya çıkabilir.

Çözüm Yaklaşımları:

ShrinkWrap Kullanımı:

Avantajları:

  • Kolay implementasyon
  • Hızlı çözüm sağlar
  • Basit yapılar için uygun

Dezavantajları:

  • Performans sorunları
  • Verimsiz render işlemi
  • İç içe listelerde sorunlar

SliverList Kullanımı:

Avantajları:

  • Yüksek performans
  • Lazy loading desteği
  • Verimli bellek kullanımı
  • Akıcı kaydırma deneyimi

Dezavantajları:

  • Daha karmaşık implementasyon
  • Öğrenme eğrisi

Optimizasyon Önerileri:

CustomScrollView Kullanımı:

  • Dış ListView.builder yerine tercih edilmeli
  • SliverList ile entegre çalışır
  • Scroll davranışını optimize eder

SliverList İmplementasyonu:

  • İç ListView’lar SliverList’e dönüştürülmeli
  • Görünür alan kadar widget render edilir
  • Bellek kullanımı optimize edilir

Önemli Noktalar:

  • Performans öncelikli düşünülmeli
  • Doğru yapı seçilmeli
  • Test edilerek kullanılmalı
  • Kullanıcı deneyimi gözetilmeli

En İyi Pratikler:

  • ShrinkWrap’ten kaçının
  • SliverList tercih edin
  • CustomScrollView kullanın
  • Lazy loading uygulayın
  • Performans testleri yapın

Okuduğunuz için teşekkürler!

Yeni yazılarda görüşmek üzere 🏄🏻‍♂️

Hesaplarıma buradan göz atabilir ve soru sorabilirsiniz.

--

--