Widget Tree — Flutter-da istifadəçi interfeysinin kompozisiyasını təyin edən vidjetlərin iyerarxik quruluşudur. İnterfeysin hər bir elementi, düymədən tutmuş bütün ekrana qədər, ana konteynerə yerləşdirilmiş ayrıca vidjetlə təmsil olunur. Flutter hər vəziyyət dəyişikliyində Widget Tree-ni yeniləyir — freymvork yeni və köhnə ağacı müqayisə edir və minimal dəyişikliklər tətbiq edir. Flutter Team, 2025 məlumatlarına görə, ağacın effektiv quruluşu animasiyaların hamarlığına və interfeysin cavab sürətinə birbaşa təsir göstərir.
Əsas məqamlar
Widget Tree — Flutter-da istifadəçi interfeysinin deklarativ təsviri, yuvalanmış vidjetlər ağacı şəklində qurulmuşdur. Hər bir vidjet UI-nin bir hissəsini təyin edir: onun konfiqurasiyası, göstərmə parametrləri və qarşılıqlı təsir zamanı davranışı. Tərtibatçı interfeysin tətbiqin cari vəziyyətində necə görünməli olduğunu təsvir edir, Flutter isə bu təsviri ekranda piksellərə çevirməyə cavabdehdir.
Tərtibatçının birbaşa interfeys elementlərini idarə etdiyi imperativ freymvorklardan fərqli olaraq, Flutter deklarativ yanaşma istifadə edir. Tətbiqin vəziyyəti dəyişdikdə yeni Widget Tree yaradılır və freymvork köhnə ilə yeni ağac arasındakı fərqi hesablayır. Bu, çəkmə əməliyyatlarının sayını minimuma endirməyə imkan verir və kodu daha proqnozlaşdırıla bilən edir.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("Widget Tree")),
body: Center(
child: Column(
children: [
Text("Salam, Flutter"),
ElevatedButton(
onPressed: () {},
child: Text("Mənə bas"),
),
],
),
),
),
);
}
}
Bu nümunədə Widget Tree MaterialApp, Scaffold, AppBar, Center, Column, Text və ElevatedButton-dan ibarətdir. Bu vidjetlərin hər biri ağacın düyünüdür. Tətbiqin vəziyyəti dəyişdikdə, Flutter build metodunu yenidən çağırır və nəticəni əvvəlki ağacla müqayisə edir.
Widget Tree runApp metoduna ötürülən kök vidjetlə başlayır. Kök vidjet adətən MaterialApp, CupertinoApp və ya WidgetsApp olur — tətbiqin qlobal parametrlərini təyin edir. Kökdən ağac uşaq vidjetlərə budaqlanır, hər biri öz növbəsində öz alt vidjetlərini ehtiva edə bilər.
Flutter-də vidjetlər single-child (child parametri ilə bir uşaq qəbul edən) və multi-child (children vasitəsilə uşaq siyahısı qəbul edən) bölünür. Single-child nümunələri: Center, Padding, SizedBox, Container. Multi-child: Column, Row, Stack, ListView, GridView. Bu fərq Widget Tree strukturuna təsir edir: multi-child vidjetlər daha geniş, single-child isə daha dərin ağaclar yaradır.
BuildContext — vidjetin Widget Tree-dəki yeridir. Hər bir vidjetin öz BuildContext-i var, o build metoduna ötürülür və ana vidjetlərə, temaya, MediaQuery və digər InheritedWidget-lərə giriş üçün istifadə olunur. BuildContext vidjetlə Element Tree-dəki elementi arasında körpüdür.
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final mediaQuery = MediaQuery.of(context);
return Container(
color: theme.colorScheme.primary,
child: Text(
"Ekran eni: ${mediaQuery.size.width}"
),
);
}
}
Bu nümunədə BuildContext tema və ekran ölçülərini əldə etmək üçün istifadə olunur. Flutter Widget Tree-də yuxarı qalxaraq ən yaxın Theme və MediaQuery-ə çatır, onlar InheritedWidget-dir. Bu, kontekstin vidjeti iyerarxiyada yerləşməsi ilə necə əlaqələndirdiyini göstərir.
Flutter tətbiqi işə salındıqda runApp funksiyası çağırılır, o kök vidjeti qəbul edir və Widget Tree-nin qurulmasına başlayır. Proses üç mərhələdən ibarətdir: vidjet konfiqurasiyasının yaradılması, Element Tree-nin formalaşdırılması və faktiki çəkmə üçün RenderObject Tree-nin qurulması.
runApp funksiyası WidgetsFlutterBinding vasitəsilə kök elementi yaradır ki, bu da freymvorku qrafik mühərriki ilə əlaqələndirir. Kök vidjet ağaca yerləşdirilir və Flutter uşaq vidjetlərlə doldurmaq üçün build metodunu çağırır. Hər build çağırışı Widget Tree-nin yeni altqrafını yaradır.
Widget Tree qurulduqdan sonra Flutter ilkin layout yerinə yetirir — bütün vidjetlərin ölçü və mövqelərinin hesablanması. Bu proses kökdən başlayır və ağac boyunca aşağı yayılır. Hər vidjet valideyndən məhdudiyyətlər alır və hesablanmış ölçünü qaytarır. Ölçülər uyğun gəlməzsə, Flutter layout xətası yaradır.
Layout tamamlandıqdan sonra Flutter hər vidjetin çəkilməsinə başlayır. RenderObject interfeys təsvirini Skia və ya Impeller vasitəsilə GPU tərəfindən yerinə yetirilən qrafik əmrlərinə çevirir. Bütün proses — Widget Tree-dən piksellərə qədər — hər vəziyyət yenilənməsində saniyədə 120 kadra qədər tezliklə təkrarlanır.
StatelessWidget — daxili dəyişən vəziyyəti olmayan vidjetdir. Onun görünüşü tamamilə konstruktor vasitəsilə ötürülən giriş parametrləri ilə müəyyən edilir. Parametrlər dəyişməyibsə, StatelessWidget yenidən qurulmur. Bu onu performans baxımından yüngül edir.
StatelessWidget-dən statik elementlər üçün istifadə edin: ikonlar, mətn etiketləri, dekorativ ayırıcılar və daxili məntiqsiz sadə düymələr. Flutter sənədlərinə görə, tipik tətbiqdə vidjetlərin təxminən 70%-i StatelessWidget ola bilər ki, bu da zibil toplayıcının yükünü azaldır və rebuild-i sürətləndirir.
StatefulWidget vidjetin yenidən qurulmaları arasında saxlanılan State obyekti yaradır. Vəziyyət dəyişdikdə (setState çağırışı ilə), Flutter vidjeti “kirli” olaraq qeyd edir və növbəti kadrda onu yenidən qurur. StatefulWidget interaktiv elementləri tətbiq etməyə imkan verir: daxiletmə sahələri, animasiyalar, taymerlər və dinamik siyahılar.
class CounterWidget extends StatefulWidget {
@override
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text("Say: $_count"),
ElevatedButton(
onPressed: () {
setState(() => _count++);
},
child: Text("Artır"),
),
],
);
}
}
Bu nümunədə StatefulWidget sayğacı dəyişdirmək üçün setState istifadə edir. Vəziyyət yeniləndikdə, Flutter Widget Tree-nin yalnız dəyişmiş hissəsini — CounterWidget vidjetini və onun alt vidjetlərini yenidən qurur. Ana vidjetlər yenidən qurulmur, bu Flutter-in deklarativ modelinin əsas üstünlüyüdür.
Widget Tree konfiqurasiya qatıdır, Element Tree isə vidjetlərlə faktiki çəkmə arasında ara halqadır. Widget Tree-dəki hər vidjet Element Tree-də vidjetə istinad saxlayan və həyat dövrünü idarə edən bir element yaradır. Bu arxitektura Flutter-ə dəyişiklikləri effektiv şəkildə emal etməyə imkan verir.
Flutter vidjetlə ilk dəfə qarşılaşdıqda, müvafiq elementi yaradan createElement metodunu çağırır. StatelessWidget üçün StatelessElement, StatefulWidget üçün isə State obyekti də yaradan StatefulElement yaradılır. Element vidjet yenidən yaradılsa belə, rebuild dövrləri arasında saxlanılır.
Key — Flutter-ə köhnə və yeni Widget Tree-dən vidjetləri uyğunlaşdırmağa kömək edən identifikatordur. Vidjetin Key-i varsa, Flutter onu ağacdakı mövqe yerinə müvafiq elementi tapmaq üçün istifadə edir. Açarlar elementlərin sırasının dəyişə biləcəyi dinamik siyahılarla işləyərkən zəruridir.
ListView(
children: items.map((item) => ListItem(
key: ValueKey(item.id),
data: item,
)).toList(),
)
Key olmadan Flutter elementləri mövqeyə görə uyğunlaşdırır ki, bu da sıra dəyişdikdə vəziyyətin düzgün saxlanmamasına səbəb ola bilər. Unikal identifikatorlu ValueKey, hər bir elementin siyahıdakı mövqeyindən asılı olmayaraq öz vəziyyətini saxlamasını təmin edir.
Widget Tree strukturu Flutter tətbiqinin performansına birbaşa təsir edir. Çox sayda yuvalanmış vidjetli dərin ağaclar layout mərhələsi üçün daha çox vaxt tələb edir və yaddaş istehlakını artırır. Flutter DevTools Widget Tree-ni təhlil etmək və darboğazları müəyyən etmək üçün alətlər təqdim edir.
Hər yuvalama səviyyəsi layout və paint üçün əlavə hesablamalar əlavə edir. Zəncirvari dərin yuvalama yerinə daha düz strukturlardan istifadə edin. Məsələn, Expanded ilə Row bir neçə yuvalanmış Container-i Align ilə əvəz edə bilər. Flutter Team məlumatlarına görə, ağacın optimallaşdırılması layout vaxtını 40% azalda bilər.
Flutter DevTools real vaxtda cari Widget Tree-ni göstərən “Widget Inspector” vidjetini təqdim edir. Tərtibatçı ekranda istənilən vidjeti seçə və onun ağacdakı yerini, parametrlərini və layout məhdudiyyətlərini görə bilər. Bu, gözlənilməz yuvalama, artıq rebuild və ölçü problemlərini müəyyən etməyə kömək edir.
RepaintBoundary — Widget Tree-nin bir hissəsini müstəqil çəkmə üçün təcrid edən vidjetdir. RepaintBoundary-nin məzmunu dəyişərsə, yalnız onun sahəsi yenidən çəkilir, bütün ekran deyil. RepaintBoundary-dən animasiyalar, siyahılar və digər tez-tez yenilənən elementlər üçün istifadə edin.
RepaintBoundary(
child: CustomPaint(
painter: MyPainter(),
child: SizedBox(
width: 200,
height: 200,
),
),
)
Bu nümunədə RepaintBoundary CustomPaint-i ayrıca çəkmə sahəsinə təcrid edir. Bu sahənin daxilində animasiya yeniləndikdə yalnız CustomPaint vidjeti yenidən çəkilir, qalan ekran dəyişməz qalır. Bu, çoxsaylı animasiya edilmiş elementləri olan mürəkkəb interfeyslərdə xüsusilə faydalıdır.
Tez-tez verilən suallar
Widget Tree — hər rebuild-də yenidən yaradılan interfeysin deklarativ təsviridir. Element Tree yeniləmələr arasında saxlanılır və həyat dövrünü, vəziyyəti və vidjetlərin faktiki RenderObject ilə uyğunlaşdırılmasını idarə edir.
Vidjetlərin sayına məhdudiyyət yoxdur, lakin praktikada minlərlə vidjeti olan ağac layout mərhələsini yavaşlada bilər. Flutter bir neçə min düyünə qədər ağaclar üçün optimallaşdırılıb; daha çox olduqda ListView.builder vasitəsilə virtualizasiya tövsiyə olunur.
Flutter DevTools — “Widget Inspector” sekmesini istifadə edin. Tətbiqi debug rejimində işə salın, brauzerdə DevTools-u açın və Widget Tree-də yerini görmək üçün ekranda istənilən vidjeti seçin.
Rebuild — vəziyyət dəyişdikdə vidjet konfiqurasiyasının yenidən yaradılması prosesidir. Flutter dəyişdirilmiş vidjetlər üçün build metodunu yenidən çağırır, yeni Widget Tree-ni əvvəlki ilə müqayisə edir və Element Tree-yə minimal dəyişikliklər tətbiq edir.
Yuvalama dərinliyini azaldın, statik elementlər üçün const-vidjetlərdən istifadə edin, animasiyaları təcrid etmək üçün RepaintBoundary tətbiq edin və StatelessWidget-in kifayət etdiyi yerlərdə artıq StatefulWidget-dən qaçının.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun