Flutter Geliştirici Mülakat Soruları v2.0 🎯
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:
- 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.