Scaffold, Flutter'da AppBar, Drawer, BottomNavigationBar ve FloatingActionButton ile temel Material Design ekran yapısını uygulayan merkezi bir widget çerçevesidir. Öğeleri yalnızca konumlandırmakla kalmaz, doğru z sırası ve kullanıcı hareketi işleme ile hazır bir mimari sağlar. Flutter Dokümantasyonu'na (2026) göre Scaffold, SnackBar ve BottomSheet dahil olmak üzere Material bileşenlerinin doğru çalışması için zorunlu bir kök öğedir. Container veya Column'un aksine Scaffold, SafeArea'yı, uyarlanabilir arka planı ve klavye davranışını otomatik olarak yönetir ve bu da onu mobil uygulamalarda ekran oluşturma standardı haline getirir.
Önemli Noktalar
Scaffold, Material Design kütüphanesinden bir düzen widget'ıdır ve bir ekranın temel görsel yapısını oluşturur. Standart Material uygulama desenini uygular: üst çubuk, ekran gövdesi, yan menü ve kayan düğmeler. Yalnızca boyutları ve stili belirleyen Container'ın aksine Scaffold, tüm ekranı birleşik bir sistem olarak yönetir.
Material Design ile oluşturulan her Flutter uygulaması MaterialApp ile başlar ve her ekran bir Scaffold içine sarılır. Scaffold, iPhone X ve üzeri için SafeArea'yı dikkate alarak AppBar'ın tüm cihazlarda doğru görüntülenmesini sağlar. Ayrıca z sırasından sorumludur: Drawer body'nin üzerinde görüntülenir ve SnackBar tüm arayüzün üzerinde ancak diyalog pencerelerinin altında görünür.
Resmi Flutter API Referansı'na (2026) göre Scaffold, SnackBar, BottomSheet ve PersistentBottomSheet gibi widget'ların doğru çalışması için zorunlu bir gerekliliktir. Scaffold olmadan, bu bileşenler Scaffold bağlamına erişmek için InheritedWidget Scaffold.of'a bağımlı olduklarından bir istisna fırlatır. Bu nedenle, Scaffold yerine doğrudan Container'a herhangi bir içerik yerleştirmek, yeni başlayan geliştiricilerin yaygın bir hatasıdır ve Material işlevselliğinin kaybına yol açar.
Tipik bir Flutter uygulamasında Scaffold, MaterialApp içinde bulunur ve genellikle çapraz platform geliştirmede WidgetsApp veya CupertinoApp altındadır. MaterialApp Navigator ve temayı oluştururken, Scaffold mevcut ekranın yapısını tanımlar. Her ekran, benzersiz AppBar, Drawer ve BottomNavigationBar ile kendi Scaffold'una sahip olabilir ve belirli bir sayfa için arayüzün esnek bir şekilde özelleştirilmesine olanak tanır.
Derin özelleştirme için Scaffold, NestedScrollView ile birleştirilebilir — bu, paralaks efekti olan daraltılabilir AppBar gibi karmaşık kaydırma efektlerinin uygulanmasını sağlar. Ancak çoğu durumda, standart Scaffold ve özellikleri, üretime hazır bir ekran oluşturmak için yeterlidir.
Scaffold, her biri arayüzün belirli bir bölümünden sorumlu olan birkaç zorunlu ve isteğe bağlı bölgeden oluşur. Birbirleriyle nasıl etkileşime girdiklerini anlamak için her parçayı ayrı ayrı inceleyelim.
AppBar, başlığı, gezinme düğmesini ve eylemleri görüntüleyen ekranın üst çubuğudur. Otomatik olarak 56dp doğru yüksekliği alır ve çentikli cihazlar için SafeArea'yı dikkate alır. bottom özelliği kullanılarak sekmeleri değiştirmek için AppBar'a TabBar eklenebilir.
Drawer, soldan dışarı kayan ve uygulama bölümleri arasında gezinme sağlayan bir paneldir. drawer özelliği ayarlanmışsa Scaffold, AppBar'a otomatik olarak bir hamburger simgesi ekler. Drawer, DrawerHeader, menü öğeleri içeren ListView ve kullanıcı bilgilerini içerebilir.
BottomNavigationBar, ana bölümler arasında geçiş yapmak için ekranın alt kısmında bir paneldir. Etiketlerle birlikte 2 ila 5 simge içerir ve NavigationBar aracılığıyla aktif gösterge ile Material 3'ü destekler. Scaffold onu ekranın altına konumlandırır ve içeriğin örtüşmemesi için body'yi otomatik olarak yukarı kaydırır.
FloatingActionButton, ekranın sağ alt köşesine yerleştirilen yuvarlak bir düğmedir. Yeni bir giriş ekleme veya mesaj gönderme gibi ekrandaki ana eylem için kullanılır. Scaffold, extended özellikleri aracılığıyla genişletilmiş animasyonlu birden çok FAB'ı destekler.
Body, ana içeriğin yerleştirildiği ekranın merkezi alanıdır. Body olarak herhangi bir widget kullanılabilir: Column, ListView, GridView, Stack veya özel bir kompozisyon. Scaffold, AppBar, BottomNavigationBar ve SafeArea'yı dikkate alarak body yüksekliğini otomatik olarak hesaplar ve manuel boyut ayarlama ihtiyacını ortadan kaldırır.
Scaffold, ekranın görünümünü ve davranışını özelleştirmek için 30'dan fazla özellik sağlar. Bunlar arasında hem zorunlu (body) hem de kenar boşluklarını, arka planı ve klavye durumunu kontrol eden isteğe bağlı özellikler bulunur. Her özelliği anlamak, arayüzü tasarım gereksinimlerine göre hassas bir şekilde yapılandırmaya yardımcı olur.
| Özellik | Tür | Açıklama |
|---|---|---|
| appBar | PreferredSizeWidget? | Başlık ve eylemlerle ekranın üst çubuğu |
| body | Widget? | AppBar ve BottomNavigationBar arasındaki ekranın ana içeriği |
| drawer | Widget? | Soldan kaydırarak açılan yan panel |
| bottomNavigationBar | Widget? | Alt gezinme çubuğu (BottomNavigationBar veya NavigationBar) |
| floatingActionButton | Widget? | Kayan eylem düğmesi |
| backgroundColor | Color? | Temayı geçersiz kılan Scaffold arka plan rengi |
| resizeToAvoidBottomInset | bool | Klavye göründüğünde body'nin otomatik daraltılması |
resizeToAvoidBottomInset özelliği, formlarla çalışırken özellikle önemlidir: true (varsayılan) olarak ayarlandığında, klavye göründüğünde Scaffold body'yi otomatik olarak daraltır ve giriş alanını görünür tutar. Bu, özel klavye dinleyicileri yazma ihtiyacını ortadan kaldırır. SingleChildScrollView ile özel senaryolar için özellik devre dışı bırakılabilir.
Material bileşenlerinin tam setiyle Scaffold'un pratik bir örneğine bakalım. Kod, AppBar, Drawer, BottomNavigationBar, FloatingActionButton ve SnackBar ile bir ekran oluşturur — Flutter'da tipik bir mobil uygulama yapısı.
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
int selectedIndex = 0;
final List<Widget> pages = [
const HomePage(),
const SearchPage(),
const ProfilePage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Uygulamam'),
actions: [
IconButton(icon: const Icon(Icons.search), onPressed: () {}),
],
),
body: pages[selectedIndex],
drawer: Drawer(
child: ListView(
children: [
const DrawerHeader(child: Text('Menü')),
ListTile(title: const Text('Ayarlar'), onTap: () {}),
],
),
),
bottomNavigationBar: NavigationBar(
selectedIndex: selectedIndex,
onDestinationSelected: (int index) {
setState(() => selectedIndex = index);
},
destinations: const [
NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
NavigationDestination(icon: Icon(Icons.search), label: 'Search'),
NavigationDestination(icon: Icon(Icons.person), label: 'Profile'),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('İşlem tamamlandı')),
);
},
child: const Icon(Icons.add),
),
);
}
}
Örnek, kullanımdan kaldırılan BottomNavigationBar yerine Material 3'ten NavigationBar kullanır. Scaffold tüm parçaları otomatik olarak bağlar: Drawer açıldığında SnackBar gizlenir; sekmeler değiştirildiğinde body güncellenir; ve FloatingActionButton yerinde kalır. ScaffoldMessenger, hiyerarşide birden çok Scaffold olsa bile SnackBar görüntülenmesini sağlar.
Material 3 (M3), Google tarafından 2023'te tanıtılan Material Design'ın evrimidir. M3'teki Scaffold birkaç değişiklik aldı: BottomNavigationBar yerine yeni bir NavigationBar widget'ı, ColorScheme.fromSeed aracılığıyla Dinamik Renk desteği ve kenar boşlukları ve bileşen yükseklikleri için güncellenmiş öneriler. M3'e geçmek Scaffold'un değiştirilmesini gerektirmez — sadece uygulama temasını güncelleyin.
Bir projede Material 3'ü etkinleştirmek için ThemeData'da useMaterial3: true ayarlamak gerekir. Scaffold görsel stili otomatik olarak uyarlar: kenar boşlukları büyür (16dp yerine 24dp), renkler tohum renginden yeniden hesaplanır ve FloatingActionButton yuvarlak köşelerle daha büyük boyutlar alır. Aynı zamanda, mevcut tüm Scaffold özellikleri çalışmaya devam eder.
Material Design 3 Spesifikasyonu'na (2026) göre, BottomNavigationBar yerine üç ila beş öğeli NavigationBar kullanılması önerilir. Scaffold her iki seçeneği de destekler, ancak NavigationBar, Pixel cihazlarda uyarlanabilirlik ve Material You için daha iyi destek sağlar.
M3 ile Scaffold'un doğru çalışması için, temayı güncellemek ve BottomNavigationBar'ı NavigationBar ile değiştirmek yeterlidir. Renkler ColorScheme.fromSeed aracılığıyla otomatik olarak hesaplanacak ve Scaffold kenar boşluklarını yeni standartlara göre ayarlayacaktır. Gerekirse backgroundColor doğrudan geçersiz kılınabilir.
Sıkça Sorulan Sorular
Scaffold, Material bileşenlerini (AppBar, Drawer, SnackBar) destekleyen tüm ekran için bir widget çerçevesidir; Container ise ekran yapısı yönetimi olmadan tek bir alt öğe için temel bir kapsayıcıdır. Scaffold z sırası, SafeArea ve otomatik jest işleme sağlarken, Container yalnızca boyutları ve stili belirler.
Teknik olarak evet, ancak pratikte önerilmez. Bir Scaffold'u başka bir Scaffold'un içine yerleştirirseniz, içteki Scaffold kendi AppBar ve BottomNavigationBar'ını oluşturur ve bu da panellerin çoğaltılmasına ve z sırasında karışıklığa yol açar. Karmaşık düzenler için tek bir Scaffold'un body'si içinde NestedScrollView veya Column kullanın.
SnackBar, Scaffold'un bir alt bileşenidir ve doğru görüntüleme için widget ağacında varlığını gerektirir. Scaffold, SnackBar'ın görünümünü canlandırdığı ve ekranın alt kısmında konumlandırdığı ScaffoldState'i sağlar. Scaffold olmadan, SnackBar InheritedWidget aracılığıyla bağlamda ScaffoldState'i bulamadığı için bir istisna fırlatır.
Scaffold'un arka plan rengi, belirli bir ekran için tema rengini geçersiz kılan backgroundColor özelliği aracılığıyla ayarlanır. Arka planı küresel olarak değiştirmeniz gerekiyorsa, ThemeData'da scaffoldBackgroundColor'ı ayarlayın. Material 3, arka plan rengini ColorScheme.surface'den otomatik olarak hesaplar, ancak manuel olarak geçersiz kılınabilir.
ScaffoldMessenger, Flutter 2.5'te tanıtılan ve hiyerarşideki mevcut Scaffold'dan bağımsız olarak SnackBar ve BottomSheet göstermeye izin veren bir yardımcı programdır. Kullanımdan kaldırılan Scaffold.of(context)'in aksine ScaffoldMessenger, ekranlar arasında gezinirken doğru şekilde çalışır ve animasyonlar sırasında bağlamı kaybetmez. Kullanıcı geri bildirimi için her zaman ScaffoldMessenger kullanılması önerilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun