getDatabasesPath()** fonksiyonu kullanılır. Bu fonksiyon, işletim sistemine özgü güvenli bir depolama konumunu döndürür. Diğer seçenekler bu amaçla kullanılan standart fonksiyonlar değildir.Mobil Programlama 2024-2025 Final
Kaynak: https://lolonolo.com/2025/12/07/mobil-programlama-2024-2025-final-sorulari-guz/
📖 Konu özeti (sınav öncesi tekrar)
Mobil Programlama 2024-2025 Final Soruları (Güz)
Mobil Programlama 2024-2025 Final Soruları (Güz)
Giriş
Mobil programlama, özellikle Flutter gibi modern çerçevelerle (framework), platformlar arası uygulama geliştirmenin temelini oluşturur. Bu süreçte veritabanı yönetimi, navigasyon, animasyonlar, hata ayıklama ve durum yönetimi gibi konular kritik öneme sahiptir. Bu makalede, Flutter ekosistemindeki temel API’ler, performans optimizasyonu ve uygulama mimarisi ele alınacaktır.
Veritabanı ve Navigasyon
Flutter uygulamalarında veritabanı (SQLite gibi) işlemleri için dosya yolunu bulmak önemlidir. sqflite paketi içindeki getDatabasesPath() fonksiyonu, işletim sistemine özgü güvenli veritabanı klasörünü döndürür.
Sayfalar arası geçişlerde (Navigasyon), Navigator.pop fonksiyonu, yığındaki (stack) en üst sayfayı kaldırarak kullanıcıyı bir önceki sayfaya döndürür. Navigator.push ise yeni bir sayfa açmak (ileriye gitmek) için kullanılır.
Performans ve Boyut Optimizasyonu
Uygulama boyutunu azaltmak için kullanılmayan kaynakların çıkarılması, görsellerin sıkıştırılması ve dağıtım sürümünde --split-debug-info etiketi kullanılması etkilidir. Ancak, Android ve iOS SDK sürümlerini düşük tutmak, uygulama boyutunu azaltan bir yöntem değildir; aksine uyumluluk ve performans sorunlarına yol açabilir.
Görsel akıcılık için ekran tazeleme hızının 16 ms‘yi (60 FPS) geçmemesi gerekir. Uygulamanın çalışma zamanı davranışlarını (bellek, performans) izlemek için ise DartDev Tools kullanılır.
Animasyonlar ve Etkileşim
Animasyonlarda duration parametresi, geçişin ne kadar süreceğini belirler. Sürekli tekrar eden veya karmaşık kontrol gerektiren animasyonlar için AnimatedWidget veya AnimationController kullanımı uygundur. Kullanıcı etkileşimlerini yakalamak için GestureDetector widget’ının onTap parametresi kullanılır.
Kütüphaneler ve Yapılandırma
Flutter’da Package (Paket) sadece Dart kodlarından oluşurken, Plugin (Eklenti) platforma özgü (Java/Kotlin, Swift) kodları da içerir. pubspec.yaml dosyasında paket sürümü zorunluluğu için dependency_overrides kullanılır.
Veritabanı işlemleri için Floor kütüphanesinde sorgular @Query ve parametreler :id şeklinde (@Query('SELECT * FROM Person WHERE id = :id')) tanımlanır. Firebase kullanımı için ise önce initializeApp() çağrılmalıdır.
Hata Yönetimi ve Durum Yönetimi (State Management)
Hata yönetiminde finally bloğu, hata olsun olmasın çalıştırılacak temizleme kodları içindir. Durum yönetiminde provider kütüphanesi kullanılırken, veri modeli ChangeNotifier sınıfından miras almalıdır.
Uygulama genelindeki veriler (oturum, sepet) için App State yaklaşımı kullanılırken, tek bir widget’ı ilgilendiren animasyon durumları için (Ephemeral State) bu yaklaşım gereksizdir. Veri akışı yukarıdan aşağıya olduğu için, üstteki widget’taki değişim, alttaki widget’ın yapıcı (constructor) fonksiyonuna parametre olarak geçilir.
Mobil Programlama 2024-2025 Final Soruları (Güz)
Mobil Programlama 2024-2025 Final Soruları (Güz)
Navigator.pop fonksiyonu, yığının en üstündeki sayfayı yığından çıkararak (pop** ederek) kullanıcıyı doğal olarak bir önceki sayfaya döndürür. Diğer fonksiyonlar:* **
Navigator.push** (A): Yeni bir sayfayı yığına ekler (ileriye gitme).* **
Navigator.move (B), Navigator.return (C), Navigator.back** (D): Navigator API’de bu işlev için standart olarak kullanılmazlar.* Kullanılmayan kaynakların çıkarılması (B) ve PNG/JPEG sıkıştırma (C) doğrudan dosya boyutunu düşürür.
* **
--split-debug-info** (D) etiketi, hata ayıklama sembollerini ayrı bir dosyaya taşıyarak ana yürütülebilir dosyanın boyutunu azaltır.* Kütüphane kaynaklarını en aza indirme (A) gereksiz bağımlılıkları ortadan kaldırır.
* Android ve iOS SDK sürümlerinin düşük tutulması (E) genellikle uygulama boyutunu etkilemez; bu, uygulamanın uyumluluk gereksinimleri ile ilgilidir ve performansı veya yeni özelliklere erişimi etkileyebilir.
AnimatedOpacity (
opacity: value,
duration: const Duration (seconds: 2),
curve: Curves.easeInOut,)
Yukarıda şeffaflık değerinin değiştirildiği bir animasyon kodu verilmektedir. Buradaki “duration:” parametresi kullanılma amacı aşağıdakilerden hangisidir?
duration parametresi, animasyonun başlangıç durumundan (eski değer) bitiş durumuna (yeni değer) olan geçişinin ne kadar zaman alacağını** (süre) belirtmek için kullanılır. Bu örnekte şeffaflık değeri 2 saniyede değişecektir.if (response.statusCode == 200)http paketi kullanılarak
http.get() ile bir web hizmetine bağlanıldığında, dönen cevap response adında bir değişkene kaydedildiyse;yukarıdaki if koşulu aşağıdaki hangi kontrolü gerçekleştirir?
200 ile başlayan kodlar (2xx aralığı), isteğin başarıyla alınıp işlendiği anlamına gelir (örneğin 200 OK). Bu nedenle, koşul Erişilen web servisinin başarılı bir cevap döndüğünü teyit eder** (B).GestureDetector widget’ı, kullanıcı etkileşimlerini (jestleri) yakalamak için kullanılır. Ekrana yapılan bir tıklama (dokunma/tap) etkileşimini yakalamak ve bu olaya tepki vermek için onTap** (B) parametresinin bir geri çağrım fonksiyonu alması gerekir. Diğerleri bu amaç için birincil parametreler değildir.AnimationController kullanılır. Bu tür bir kontrolcü ile çalışan ve sürekli değişen değerleri dinleyen özel widget’lar oluşturmak için AnimatedWidget (C) sınıfından miras almak veya daha yaygın olarak StatefulWidget ve SingleTickerProviderStateMixin** kullanmak uygundur. Diğer seçenekler (A, B, E) önceden tanımlanmış (implicitly) ve otomatik geçiş sağlayan widget’lardır, sürekli tekrar için ideal değildir._) ile başlaması, o değişkenin (veya sınıfın/fonksiyonun) yalnızca tanımlandığı kütüphane (library) içinde kullanılabilir olduğunu, yani **private** (D) olduğunu belirtir. Bu durum, sınıfa dışarıdan erişimi engeller (ancak Dart’ta `private` kapsamı sınıf değil, dosya/kütüphane düzeyindedir).* **
Package (Paket)**: Tamamen Dart kodundan oluşur ve platforma özgü bir kodlama (iOS/Android) gerektirmez.* **
Plugin (Eklenti): Dart koduna ek olarak, mobil cihazın donanımına veya işletim sistemi API’lerine erişim sağlamak için platforma özgü kodlama (köprü)** (Java/Kotlin, Swift/Objective-C) içerir.Bu nedenle B şıkkı doğrudur.
1000 ms / 60 = 16.67 ms sürede çizilmesi demektir. Dolayısıyla, ekran tazeleme hızının 16 milisaniyeyi** (C) geçmemesi gerekir.DartDev Tools** (E)’dur.flutter_test paketi içerisindeki Matcher sabitlerinden biri değildir?findsNothing → Hiçbir widget bulmazsa geçer
findsWidgets → Bir veya daha fazla widget bulursa geçer
findsNWidgets(n) → Tam olarak n tane widget bulursa geçer
matchesGoldenFile → Golden file (görsel) testlerinde kullanılır, flutter_test içinde tanımlıdır
firebase_core paketi aracılığıyla initializeApp()** (D) fonksiyonunun çağrılması ve uygulamanın Firebase ile başlatılması gerekir.pubspec.yaml dosyasında aşağıdaki başlıklardan hangisi kullanılır?pubspec.yaml dosyasında, normal bağımlılıklar (dependencies) listesinde çakışma veya uyumsuzluk olduğunda, bir paketin belirli bir sürümünü kullanma zorunluluğu veya kısıtlaması için dependency_overrides** (B) başlığı kullanılır.'SELECT * FROM Person WHERE id = 2'Floor kütüphanesini kullanarak yukarıdaki gibi bir sorgu yazmak istenirse aşağıdakilerden hangisi kullanılmalıdır?
@Query (D) veya @Insert gibi etiketler kullanılır. Sorgu içinde bir değişkene atıf yapılırken :id** (C) formatı kullanılır. Eğer sorguda id = 2 gibi sabit bir değer yerine değişken kullanılacaksa **:id** formatı tercih edilir. (Not: D şıkkı olan @Query('SELECT * FROM Person WHERE id = ?') de Floor kütüphanesinde pozisyonel parametre olarak geçerlidir, ancak `id = :id` (C şıkkı) adlandırılmış parametre olduğu için daha yaygın ve okunurdur. Verilen seçenekler arasında C şıkkı, `id = 2` sorgusunun değişkenli hale getirilmiş, en yaygın ve doğru Floor kullanımını temsil eder.)Yukarıdaki cümlede yer alan boşluğa aşağıdaki seçeneklerden hangisi gelmelidir?
finally bloğu, try veya catch bloklarının çalıştırılmasından sonra, istisna (hata) oluşsa da oluşmasa da kesinlikle çalıştırılması gereken** kodları (örneğin, dosya veya veritabanı bağlantılarını kapatma gibi temizleme işlemlerini) içermek için kullanılır.provider kütüphanesi ile durum yönetimi (state management) yapılırken, değişimi dinlenecek olan veri modelinin (Model Class) diğer widget’ları uyarabilmesi için Dart’ın ChangeNotifier (A) sınıfından miras alması ve veri değiştiğinde notifyListeners()** metodunu çağırması gerekir.setState(() {
_active = _active;
});
Yukarıdaki kod parçasında “setState” içerisinde “_active” değeri güncellenmiş ve bu değere göre hiyerarşide içteki bir widget arkaplan rengini seçecektir.
Hal böyle iken, setState metodu arayüz bileşenlerinin oluşturduğu ağaçta güncellenecek arayüz bileşeninden daha dış seviyede bulunuyorsa, arayüz güncellenmesinde değişen veri içteki arayüz bileşenlerine (widget) aktarılma yöntemi aşağıdakilerden hangisidir?
StatefulWidget’ın setState() ile durumu güncellendiğinde, bu yeni veri, ilgili widget’ın (arayüz bileşeninin) build metodu içinde, içeride kalan (child) widget’ın yapıcı (constructor) fonksiyonuna** (E) parametre olarak beslenir. Bu, verinin hiyerarşide alt seviyelere aktarılma şeklidir.GridView widget’ı, çocuk widget’ları (children) düzenli bir ızgara (grid) şeklinde (birden fazla sütun/satır) ve kaydırılabilir** (scrollable) bir görünüm içinde düzenlemek için kullanılır.Aşağıdakilerden hangisi için “App State” yaklaşımını kullanmak gereksiz olacaktır?
App State** (Uygulama genelindeki durum), uygulamanın birçok farklı yerinde ihtiyaç duyulan ve değiştirildiğinde birçok widget’ı etkilemesi gereken veriler (oturum bilgisi, sepet içeriği, bildirimler) için kullanılır (B, C, D, E). Bir animasyonlu widgetın animasyonu oynatımı (A) ise genellikle yalnızca o widget’ı veya yakın çevresini etkileyen, yerel (local) bir durumdur ve uygulama genelinde izlenmesi (App State) gereksizdir.