Widget tree: Stateless və Stateful
Flutter-də hər şey widget-dir: düymə də, padding də, bütöv ekran da. Widget-lər ağac (tree) şəklində yerləşir və hər biri immutable konfiqurasiyadır — yəni widget obyektinin özü dəyişmir, yenisi yaradılır.
İki əsas növ var:
- StatelessWidget — daxili vəziyyəti yoxdur; eyni girişlə həmişə eyni nəticəni verir
- StatefulWidget — dəyişən vəziyyəti var; vəziyyət ayrıca
Stateobyektində yaşayır
Bu ayrılığın səbəbi budur: widget hər rebuild-də yenidən yaradılır, amma State obyekti yaşamağa davam edir. Ona görə TextEditingController, animasiya controller-i və s. State-də saxlanılır, widget-in özündə yox.
Flutter əslində üç ağac saxlayır və interview-də bu fərq soruşulur:
- Widget tree — sənin yazdığın konfiqurasiya; ucuzdur, tez-tez yenidən yaradılır
- Element tree — widget-lərin "canlı" nüsxələri; ağacın vəziyyətini və mövqeyini saxlayır
- Render tree — ölçmə və çəkmə ilə məşğul olan qat
Rebuild zamanı Flutter yeni widget ağacını köhnəsi ilə müqayisə edir və yalnız fərqi element/render ağacına tətbiq edir. Buna görə build() metodunun tez-tez çağırılması özlüyündə problem deyil — problem build() içində ağır iş görməkdir.
| Sual | StatelessWidget | StatefulWidget |
|---|---|---|
| Daxili dəyişən vəziyyət | yoxdur | var, `State` obyektində |
| Nə vaxt rebuild olur | valideyn onu yenidən qurduqda | həmçinin `setState` çağırıldıqda |
| Tipik istifadə | ikon, etiket, statik kart | forma, sayğac, animasiya |
| Yaddaş və dispose | lazım deyil | `dispose()`-da təmizlənməlidir |
Interview ipucu. "Stateless və Stateful fərqi nədir?" sualına yalnız tərif vermək junior cavabıdır. Güclü cavab niyəsini əlavə edir: widget immutable-dır, ona görə dəyişən vəziyyət ayrıca State obyektində saxlanılır və rebuild-dən sağ çıxır. Sonda praktik nəticəni de: "ona görə controller-ləri `State`-də yaradıram və `dispose()`-da bağlayıram". Bir addım da irəli getmək istəyirsənsə, üç ağacdan danış — namizədlərin əksəriyyəti bunu bilmir.
📚 Mənbələr və sənədlər
- Widget-lərə girişrəsmidocs.flutter.dev
- StatefulWidget classrəsmiapi.flutter.dev
Sənəddəki "Performance considerations" bölməsi rebuild xərcini birbaşa izah edir.
- StatelessWidget classrəsmiapi.flutter.dev
- Element classrəsmiapi.flutter.dev