Flutter Widgets — nedir, widget ağacı ve build

Yazar: IT Sectr Yayınlanma: 2026-02-21 Okuma süresi: 8 dk

Flutter Widgets — Aralık 2018'de kararlı sürüm 1.0 olarak yayınlanan Google Flutter çerçevesindeki kullanıcı arayüzünün temel yapı taşlarıdır. Flutter'da her şey bir widget'tır: ekranlar ve düğmelerden boşluk ve hizalamaya kadar. Widget'lar, Flutter'ın kendi Skia/Impeller motorunda oluşturduğu ve platformun yerel bileşenlerini atlayan bir ağaç (widget tree) oluşturur. Google I/O (2025)'ya göre, Flutter Google Play ve App Store'da 500.000'den fazla uygulamada kullanılmaktadır. Flutter mimarisi, widget'ları StatelessWidget (değişmez) ve StatefulWidget (State nesnesi aracılığıyla değişebilir durumlu) olarak ayırır.

Önemli Noktalar

  • Flutter Widgets — Flutter'daki tüm UI öğeleri: ekranlar ve düğmelerden boşluk ve hizalamaya kadar; çerçeve, platformun yerel bileşenlerini kullanmaz.
  • StatelessWidget — değişebilir durumu olmayan widget; kurucu aracılığıyla iletilen verileri görüntüler ve build'den sonra değişmez.
  • StatefulWidget — yeniden oluşturmalardan (rebuild) kurtulan ayrı bir State nesnesinde depolanan değişebilir duruma sahip widget.
  • Widget ağacı (widget tree) — UI'yi tanımlayan widget hiyerarşisi; Flutter, oluşturma için bunu Element Tree ve Render Tree'ye dönüştürür.
  • BuildContext — ağaçtaki widget'ın konumuna, temaya, MediaQuery ve InheritedWidget'a erişim sağlayan derleme bağlamı.

Flutter Widgets Nedir?

Flutter Widgets — Flutter çerçevesindeki tüm UI öğeleri, değişmez (immutable) Dart sınıfları olarak uygulanır. Bir widget, bir UI öğesinin yapılandırmasıdır: boyutu, rengi, konumu ve olay işleyicileri. Android (XML + View) veya iOS (Storyboard + UIView)'un aksine, Flutter yerel bileşenleri kullanmaz — her şey Canvas üzerinde Skia (Android/iOS/Linux) veya Impeller (iOS/macOS) motoru tarafından çizilir. Bu, platform farklılıkları olmadan tüm platformlarda tutarlı bir görünüm sağlar. Flutter iki widget seti ile birlikte gelir: Material Widgets (Android/web için Google Material Design 3) ve Cupertino Widgets (iOS/macOS için Apple HIG). Geliştirici, tek bir uygulamada her iki seti birleştirebilir. Her widget, bir alt widget veya bunların birleşimini döndüren build() yöntemine sahiptir — widget ağacı bu şekilde oluşturulur.

Flutter'ın üç ağacı

Flutter üç ağaçla çalışır: Widget Tree (geliştirici tarafından oluşturulan yapılandırma), Element Tree (widget'ın ağaçtaki konumuna eşlenmesi, çerçeve tarafından yönetilir) ve Render Tree (düzeni hesaplayan ve boyamayı gerçekleştiren nesneler). Bir Widget bir Element oluşturur, Element bir RenderObject oluşturur. Yapılandırma değiştiğinde (rebuild) Element yeniden kullanılır — bu Flutter'ın optimizasyon mekanizmasıdır: widget türü ve key eşleşirse, Element yeniden oluşturulmaz, yeni yapılandırmayla güncellenir. Üç ağacı anlamak, Flutter uygulama performansını optimize etmenin anahtarıdır.

StatelessWidget: değişmez widget'lar

StatelessWidget — dahili durumu depolamayan bir widget'tır. Parametreleri kurucu aracılığıyla alır ve build'den sonra değiştirme olanağı olmadan görüntüler. StatelessWidget statik öğeler için idealdir: başlıklar, simgeler, avatarlar, sabit verili listeler. build() yöntemi, oluşturma sırasında bir kez ve üst widget değiştiğinde çağrılır. StatelessWidget'ın durumu olmadığından, ayrı bir State nesnesi gerektirmez — build() doğrudan widget sınıfında tanımlanır.

dart
import 'package:flutter/material.dart';

class ProfileHeader extends StatelessWidget {
  final String name;
  final String avatarUrl;

  const ProfileHeader({super.key, required this.name, required this.avatarUrl});

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        CircleAvatar(
          radius: 24,
          backgroundImage: NetworkImage(avatarUrl),
        ),
        const SizedBox(width: 12),
        Text(
          name,
          style: const TextStyle(
            fontSize: 18,
            fontWeight: FontWeight.bold,
          ),
        ),
      ],
    );
  }
}

ProfileHeader — kurucu aracılığıyla name ve avatarUrl alan bir StatelessWidget'tır. CircleAvatar avatarı görüntüler, Text adı görüntüler. Widget, oluşturulduktan sonra bu değerleri değiştiremez. const kurucu (const ProfileHeader) kullanmak, Flutter'ın üst yeniden oluşturma sırasında widget örneğini yeniden kullanmasına olanak tanır — tüm StatelessWidget'lar için önerilen bir mikro optimizasyon.

StatefulWidget: durumlu widget'lar

StatefulWidget — ayrı bir State nesnesinde depolanan değişebilir duruma sahip widget'tır. StatefulWidget'ın kendisi, StatelessWidget gibi değişmezdir. Değişebilir kısım State'e devredilir: State bir kez oluşturulan ve birden çok widget yeniden oluşturmasından kurtulan bir nesnedir. Durum değiştiğinde (setState()), Flutter State üzerinde build()'i çağırır ve UI'yı günceller. StatefulWidget etkileşimli öğeler için kullanılır: sayaçlar, metin alanları, onay kutuları, animasyonlar, zamanlayıcılar.

dart
import 'package:flutter/material.dart';

class LikeButton extends StatefulWidget {
  const LikeButton({super.key});

  @override
  State<LikeButton> createState() => _LikeButtonState();
}

class _LikeButtonState extends State<LikeButton> {
  bool liked = false;
  int count = 42;

  void _toggleLike() {
    setState(() {
      liked = !liked;
      count += liked ? 1 : -1;
    });
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _toggleLike,
      child: Text(liked ? '♥ $count' : '♡ $count'),
    );
  }
}

LikeButton — State sınıfı _LikeButtonState ile bir StatefulWidget'tır. liked ve count alanları State'te depolanan durumdur ve yeniden oluşturmada sıfırlanmaz. setState() Flutter'a UI'nın yeniden oluşturulması gerektiğini bildirir. Flutter, her üst yeniden oluşturmada State'i yeniden oluşturmaz — yalnızca yapılandırma (key veya widget türü) değiştiğinde. IT Sectr'de, görüntüleme için StatelessWidget ve etkileşimli bileşenler için StatefulWidget kullanıyoruz, StatefulWidget'ı mutasyon sınırlarına kadar en aza indirme ilkesini izleyerek.

Widget ağacı: Widget'tan RenderObject'a

Widget Tree — uygulama UI'sını tanımlayan widget'ların hiyerarşik yapısıdır. Flutter, Widget Tree'yi Element Tree'ye dönüştürür: her Widget bir Element oluşturur ve Element, ağaçtaki konumunu ve bir RenderObject ile bağlantısını izler. Render Tree, düzeni (boyutların ve konumların belirlenmesi) ve boyamayı (oluşturma) gerçekleştirir. Element önemli bir optimizasyon katmanıdır: yeniden oluşturma sırasında widget türü ve key değişmemişse, Element yeniden kullanılır, RenderObject'u yeniden oluşturmadan yapılandırmayı günceller. Bu, yüksek kare hızlarında (60/120 FPS) Flutter'ın performansını sağlar.

dart
import 'package:flutter/material.dart';

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter Widget'ları')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Icon(Icons.flutter_dash, size: 80),
            const SizedBox(height: 16),
            const Text(
              'Merhaba, Flutter!',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

HomeScreen widget ağacı: Scaffold → AppBar + Center → Column → [Icon, SizedBox, Text]. Scaffold, kök Material Design düzen widget'ıdır. Center, alt Column'u ortalar. Column, alt öğeleri dikey olarak merkez hizalama (mainAxisAlignment.center) ile düzenler. Flutter düzeni yukarıdan aşağıya (kısıtlamalar üstten iletilir) ve boyutları aşağıdan yukarıya (sizedByParent veya alt öğelerden boyutlandırma) hesaplar.

BuildContext: derleme bağlamı ve ağaç erişimi

BuildContext — Element Tree'deki widget konumunun bir tanımlayıcısıdır. Her build() yöntemi bir BuildContext alır ve widget bu aracılığıyla şunlara erişebilir: MediaQuery (ekran boyutu, yönlendirme, piksel yoğunluğu, güvenli alan), Theme (MaterialThemeData veya CupertinoThemeData), Navigator (gezinme yığını), ScaffoldMessenger (SnackBar), InheritedWidget (ağaçta aşağıya veri aktarma). BuildContext, build() tamamlandıktan sonra kaydedilmemeli veya eşzamanlı bir bağlam dışında kullanılmamalıdır — bu, “Scaffold.of() called with a context that does not contain a Scaffold” gibi hatalara yol açar. Bağlamı kaydetmek yerine, veri erişimi için Builder widget'ını veya InheritedWidget modelini kullanın.

Key: ağaçta widget tanımlama

Key — her widget'ın kurucusunun isteğe bağlı bir parametresidir (super.key). Key, Flutter'ın bir listedeki öğelerin sırası veya sayısı değiştiğinde bir widget'ı tanımlamasına yardımcı olur. Key olmadan Flutter, widget'ları türe ve konuma göre karşılaştırır; key olmadan bir listenin ortasına bir öğe eklendiğinde, Flutter yanlış widget için Element'i yeniden kullanır ve bu da durum hatalarına (StatefulWidget) ve animasyon sorunlarına neden olur. Listeler için ValueKey (benzersiz tanımlayıcı), ObjectKey (veri nesnesine dayalı), UniqueKey (her yeniden oluşturmada garantili benzersiz — zorunlu yeniden oluşturma için) kullanın.

Flutter Widget Kataloğu: Material, Cupertino, Layout

Flutter SDK (kararlı sürüm 3.3+, Dart 3+), kategorilere ayrılmış 200'den fazla yerleşik widget içerir: Layout (Row, Column, Stack, Container, Expanded, Flexible, Wrap, GridView, ListView, CustomScrollView), Material Design (Scaffold, AppBar, Card, Drawer, BottomNavigationBar, FloatingActionButton, TabBar, Chip, DataTable), Cupertino (CupertinoPageScaffold, CupertinoNavigationBar, CupertinoButton, CupertinoTabBar), Painting & Effects (Opacity, DecoratedBox, ClipRect, Transform, BackdropFilter, ShaderMask), Async (FutureBuilder, StreamBuilder) ve Accessibility (Semantics, MergeSemantics, ExcludeSemantics). Düzen widget'ları herhangi bir Flutter UI'sının temelidir: Row yatay diziler için, Column dikey için, Stack üst üste binen öğeler için, Container BoxDecoration ile dekorasyon için.

KategoriAnahtar Widget'larAmaç
LayoutRow, Column, Stack, Container, Expanded, FlexibleAlt öğelerin konumlandırılması ve boyutlandırılması
MaterialScaffold, AppBar, Card, Drawer, FAB, TabBarMaterial Design 3 UI bileşenleri
CupertinoCupertinoPageScaffold, CupertinoNavigationBar, CupertinoButtoniOS stili bileşenler
PaintingOpacity, ClipRect, Transform, DecoratedBox, BackdropFilterGörsel efektler ve kırpma
AsyncFutureBuilder, StreamBuilderUI durumlarıyla asenkron veri yükleme
AccessibilitySemantics, MergeSemanticsEkran okuyucular için anlamsal işaretleme

Sıkça Sorulan Sorular

StatelessWidget, StatefulWidget'dan nasıl farklıdır?

StatelessWidget'ın dahili durumu yoktur — tüm veriler kurucu aracılığıyla iletilir ve değişmez. StatefulWidget, yeniden oluşturmalardan kurtulan ayrı bir State nesnesinde değişebilir durumu depolar. Durum değişikliği setState()'i çağırır ve Flutter UI'yı yeniden oluşturur. Değişmez öğeler için StatelessWidget kullanın; etkileşimli öğeler için StatefulWidget kullanın.

Flutter'da BuildContext nedir?

BuildContext, build() yöntemine iletilen Element Tree'deki widget konumunun bir tanımlayıcısıdır. Bağlam aracılığıyla, bir widget MediaQuery, Theme, Navigator, ScaffoldMessenger ve InheritedWidget'a erişir. BuildContext, build() tamamlandıktan sonra kaydedilmemelidir. Veri erişimi için Builder widget'ını veya InheritedWidget'ı kullanın.

Flutter ile çalışmak için Dart bilmek gerekli mi?

Evet, Flutter tek programlama dili olarak Dart'ı kullanır. Dart, null safety, sound null safety, extension methods ve pattern matching ile statik olarak türlenmiş bir dildir. Başlamak için temel Dart bilgisi yeterlidir: sınıflar, işlevler, async/await, koleksiyonlar. Dart, Dart Native aracılığıyla yerel koda (AOT) ve Dart2JS aracılığıyla JavaScript'e (web için) derlenir.

Flutter yalnızca mobil platformlar için mi?

Hayır, Flutter altı platformu destekler: iOS, Android, Web, macOS, Windows, Linux. Kodun %90'ından fazlası tüm platformlarda paylaşılır. Platform adaptasyonları (kamera, dosya sistemi) eklentiler veya platform kanalları aracılığıyla uygulanır. Masaüstü için Flutter, Flutter Desktop pencere kabuğunu kullanır; web için CanvasKit (WebGL) veya HTML oluşturucuyu kullanır.

Flutter 60 FPS performansına nasıl ulaşır?

Flutter 60/120 FPS'ye şunlarla ulaşır: kendi 2D motoru (Skia/Impeller), yerel köprü olmaması (React Native'in aksine), tür/key değişmediğinde Element yeniden kullanımıyla üç ağaç (Widget → Element → Render), tek yönlü geçişli düzen algoritması (kısıtlamalar aşağı, boyutlar yukarı) ve ekranın ayrı alanlarının yeniden boyanmasını izole etmek için RepaintBoundary.

Özet

  • Flutter Widgets — Scaffold'tan SizedBox'a tüm UI öğeleri; Flutter onları kendi Skia/Impeller'da oluşturur, yerel bileşenler kullanmaz.
  • StatelessWidget — durumsuz widget; build(), değişmez kurucu parametrelerine dayalı UI döndürür.
  • StatefulWidget — State'te değişebilir duruma sahip widget; setState() UI yeniden oluşturmayı tetikler.
  • Flutter'ın üç ağacı: Widget (yapılandırma) → Element (konum) → Render (düzen + boya); performans için Element yeniden kullanılır.
  • BuildContext — ağaçtaki widget konumu; MediaQuery, Theme, Navigator, InheritedWidget'a erişim.
  • Material ve Cupertino — sırasıyla Google Material Design 3 ve Apple HIG için iki widget seti.
  • Key (ValueKey, ObjectKey, UniqueKey) — listede sıra veya miktar değiştiğinde widget tanımlama.

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.

Projeyi tartış

Ayrıca okuyun