Bu proje, Flutter'ın render katmanının gücünü ve esnekliğini göstermek amacıyla oluşturulmuş ileri düzey bir demo uygulamasıdır. Standart Column, Row veya Stack gibi mevcut layout widget'larını kullanmak yerine, bu proje sıfırdan, kendi yerleşim (layout) ve çizim (painting) mantığına sahip özel bir RenderObject'in nasıl yaratılacağını adım adım sergilemektedir.
Projenin merkezinde, kendisine verilen alt widget'ları (children) mükemmel bir dairesel yörünge etrafına eşit aralıklarla dizen CircularLayoutWidget bulunmaktadır.
Bu proje, aşağıdaki Medium makalesinin pratik uygulaması olarak geliştirilmiştir:
Çoğu Flutter geliştiricisi, StatelessWidget ve StatefulWidget'ları bir araya getirerek harika kullanıcı arayüzleri oluşturur. Ancak bazen, Flutter'ın sunduğu standart layout widget'ları hayalimizdeki tasarımı veya performansı tam olarak karşılamayabilir. İşte bu noktada, Flutter'ın en derin katmanına, yani Render Ağacı'na inmemiz gerekir.
Bu projenin amacı, şu temel sorulara somut kodlarla cevap vermektir:
- Flutter'ın Üç Ağacı (
Widget,Element,Render) Nasıl Çalışır? Bu üçlü yapının birbiriyle nasıl konuştuğunu ve birWidget'ın ekranda nasıl piksele dönüştüğünü anlamak. RenderObjectNedir? Flutter'ın layout ve painting motorunun temel taşı olan bu sınıfın sorumluluklarını keşfetmek.performLayout()vepaint()Metotları Ne İşe Yarar? BirRenderObject'in "kendini ve çocuklarını nasıl ölçeceğini" ve "ekrana nasıl çizeceğini" belirleyen bu iki kritik metodu derinlemesine incelemek.- Sıfırdan Bir Layout Widget'ı Nasıl Yazılır? Mevcut widget'ları birleştirmek yerine, tamamen özgün bir yerleşim mantığı oluşturarak Flutter'ın temel yeteneklerini nasıl genişletebileceğimizi göstermek.
Bu proje, sadece bir "kod örneği" değil, aynı zamanda Flutter'ın render pipeline'ı üzerine bir eğitim materyalidir.
Projenin kalbi olan CircularLayoutWidget, kendisine children olarak verilen bir listeyi alır ve onları bir saat kadranı gibi dairesel bir patikaya yerleştirir.
Bu widget'ı hayata geçirmek için üç ana bileşen oluşturulmuştur:
-
CircularLayoutWidget(MultiChildRenderObjectWidget): Geliştiricinin doğrudan kullandığı,childrenlistesini kabul eden arayüz widget'ıdır. Görevi, Flutter'a kendi özelRenderObject'imizi oluşturmasını söylemektir.- Dosya:
lib/circular_layout_widget.dart
- Dosya:
-
RenderCircularLayout(RenderBox): Tüm sihrin gerçekleştiği yerdir. Bu sınıf,RenderObject'in kendisidir.performLayout()Metodu: Bu metot içinde, widget'ın kendi boyutları hesaplanır. Ardından, her bir alt widget (child) için dairesel yörünge üzerindeki(x, y)pozisyonu trigonometrik fonksiyonlar (cos,sin) kullanılarak belirlenir. Her çocuk ölçülür ve hesaplanan bu pozisyona yerleştirilir.paint()Metodu: Bu metot,ContainerRenderObjectMixin'den gelendefaultPaintmetodunu çağırarak,performLayoutaşamasında konumları belirlenmiş olan tüm çocukların kendilerini ekrana çizmelerini sağlar.- Dosya:
lib/render_circular_layout.dart
-
ParentData: Flutter'ın render ağacında, bir ebeveynin her bir çocuğu hakkında ekstra layout bilgisi (örneğin
Offset) saklaması için kullandığı mekanizmadır. Bu projede,RenderBoxParentDatakullanılarak her çocuğun konumuperformLayoutsırasında ayarlanır.
Bu yapı sayesinde, CircularLayoutWidget tıpkı bir Column veya Row gibi deklaratif bir şekilde kullanılabilirken, arka planda tamamen özel bir layout algoritması çalıştırır.
Bu proje, Flutter'ın harici kütüphanelerden ziyade temel (core) yeteneklerine odaklanmaktadır:
- Flutter & Dart
- Widget Tree, Element Tree, Render Tree: Flutter'ın temel mimarisini oluşturan üçlü ağaç yapısı.
RenderObject&RenderBox: Flutter'ın layout ve painting sisteminin temel sınıfları.MultiChildRenderObjectWidget: Birden fazla alt widget'ı yöneten özelRenderObjectwidget'ları oluşturmak için temel sınıf.ContainerRenderObjectMixin:RenderObject'in çocuk listesini yönetmeyi kolaylaştıran bir mixin.- Trigonometri (
sin,cos): Dairesel pozisyonları hesaplamak için kullanılan matematiksel temel.
Proje, konseptin anlaşılırlığını en üst düzeye çıkarmak için olabildiğince basit tutulmuştur:
lib/
├── circular_layout_widget.dart # Geliştiricinin kullandığı public Widget
├── main.dart # Uygulamanın giriş noktası ve demo sayfası
└── render_circular_layout.dart # Asıl layout ve painting mantığını içeren RenderObject