Flutter Widgets — ano ito, puno ng widget at build

May-akda: IT Sectr Nai-publish: 2026-02-21 Oras ng pagbabasa: 8 min

Flutter Widgets — pangunahing mga bloke ng gusali ng user interface sa Google Flutter framework, na inilabas sa stable na bersyon 1.0 noong Disyembre 2018. Sa Flutter, lahat ay widget: mula sa screen at button hanggang sa espasyo at pagkakahanay. Ang mga widget ay bumubuo ng isang puno (widget tree) na nirerender ng Flutter sa sarili nitong Skia/Impeller engine, na lumalampas sa mga native na bahagi ng platform. Ayon sa Google I/O (2025), ang Flutter ay ginagamit sa mahigit 500,000 apps sa Google Play at App Store. Hinahati ng arkitektura ng Flutter ang mga widget sa StatelessWidget (hindi nababago) at StatefulWidget (na may nababagong estado sa pamamagitan ng State object).

Mga Pangunahing Punto

  • Flutter Widgets — lahat ng UI elemento sa Flutter: mula sa screen at button hanggang sa espasyo at pagkakahanay; hindi gumagamit ng native na mga bahagi ng platform ang framework.
  • StatelessWidget — widget na walang nababagong estado; nagpapakita ng data na ipinasa sa pamamagitan ng constructor at hindi nagbabago pagkatapos ng build.
  • StatefulWidget — widget na may nababagong estado, na nakaimbak sa isang hiwalay na State object na nakaligtas sa rebuilds.
  • Puno ng widget (widget tree) — hierarchy ng mga widget na naglalarawan ng UI; ginagawa ito ng Flutter sa Element Tree at Render Tree para sa rendering.
  • BuildContext — konteksto ng build, na nagbibigay ng access sa posisyon ng widget sa puno, tema, MediaQuery at InheritedWidget.

Ano ang Flutter Widgets?

Flutter Widgets — lahat ng UI elemento sa Flutter framework, na ipinatupad bilang hindi nababagong (immutable) Dart classes. Ang widget ay isang configuration ng isang UI elemento: ang laki, kulay, posisyon, paghawak ng kaganapan. Hindi tulad ng Android (XML + View) o iOS (Storyboard + UIView), ang Flutter ay hindi gumagamit ng native na mga bahagi — lahat ay iginuhit ng Skia engine (Android/iOS/Linux) o Impeller (iOS/macOS) sa Canvas. Tinitiyak nito ang magkaparehong hitsura sa lahat ng platform nang walang pagkakaiba sa platform. Ang Flutter ay may dalawang set ng widget: Material Widgets (disenyo ng Google Material Design 3 para sa Android/Web) at Cupertino Widgets (disenyo ng Apple HIG para sa iOS/macOS). Maaaring pagsamahin ng developer ang parehong set sa isang app. Bawat widget ay may build() method na nagbabalik ng child widget o komposisyon ng mga ito — ganito binuo ang puno ng widget.

Tatlong puno ng Flutter

Gumagana ang Flutter sa tatlong puno: Widget Tree (configuration, ginawa ng developer), Element Tree (pagtutugma ng widget sa posisyon sa puno, pinamamahalaan ng framework), Render Tree (mga bagay na nagkalkula ng layout at nagsasagawa ng paint). Gumagawa ang Widget ng Element, na gumagawa ng RenderObject. Ang Element ay muling ginagamit sa pagbabago ng configuration (rebuild) — ito ang mekanismo ng optimisasyon ng Flutter: kung pareho ang uri ng widget at key, hindi muling nilikha ang Element, sa halip ay ina-update ang bagong configuration. Ang pag-unawa sa tatlong puno ay susi sa pag-optimize ng pagganap ng mga Flutter app.

StatelessWidget: hindi nababagong mga widget

StatelessWidget — isang widget na hindi nag-iimbak ng panloob na estado. Tumatanggap ito ng mga parameter sa pamamagitan ng constructor at ipinapakita ang mga ito nang walang posibilidad na magbago pagkatapos ng build. Ang StatelessWidget ay mainam para sa mga static na elemento: mga heading, icon, avatar, listahan na may nakapirming data. Ang build() method ay tinatawag nang isang beses sa paggawa at sa pagbabago ng parent widget. Dahil ang StatelessWidget ay walang estado, hindi ito nangangailangan ng hiwalay na State object — ang build() ay direktang tinukoy sa klase ng widget.

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 — isang StatelessWidget na tumatanggap ng name at avatarUrl sa pamamagitan ng constructor. Ipinapakita ng CircleAvatar ang avatar, Text ang pangalan. Hindi mababago ng widget ang mga halagang ito pagkatapos ng paggawa. Ang paggamit ng const constructor (const ProfileHeader) ay nagpapahintulot sa Flutter na muling gamitin ang instance ng widget sa rebuild ng parent — ito ay isang micro-optimization na inirerekomenda para sa lahat ng StatelessWidget.

StatefulWidget: mga widget na may estado

StatefulWidget — isang widget na may nababagong estado, na nakaimbak sa isang hiwalay na State object. Ang StatefulWidget mismo ay hindi nababago (immutable), tulad ng StatelessWidget. Ang nababagong bahagi ay inilalagay sa State: State — isang bagay na ginagawa nang isang beses at nakaligtas sa maraming rebuild ng widget. Kapag nagbago ang estado (setState()), tinatawag ng Flutter ang build() ng State, ina-update ang UI. Ang StatefulWidget ay ginagamit para sa mga interactive na elemento: mga counter, text field, checkbox, animation, timer.

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 — isang StatefulWidget na may State class na _LikeButtonState. Ang mga field na liked at count ay estado na nakaimbak sa State at hindi nirerese sa rebuild. setState() ay nagpapaalam sa Flutter na kailangan muling buuin ang UI. Hindi muling nililikha ng Flutter ang State sa bawat rebuild ng parent — tanging sa pagbabago ng configuration (key o uri ng widget). Sa IT Sectr, ginagamit namin ang StatelessWidget para sa display at StatefulWidget para sa mga interactive na bahagi, kasunod ng prinsipyo ng pag-minimize ng StatefulWidget hanggang sa hangganan ng mutation.

Puno ng widget: mula Widget hanggang RenderObject

Widget Tree — ang hierarchical na istraktura ng mga widget na naglalarawan ng UI ng app. Ginagawa ng Flutter ang Widget Tree sa Element Tree: bawat Widget ay gumagawa ng Element na sinusubaybayan ang posisyon sa puno at koneksyon sa RenderObject. Ginagawa ng Render Tree ang layout (pagtukoy ng laki at posisyon) at paint (pagguhit). Ang Element ay ang pangunahing layer ng optimisasyon: kung ang uri ng widget at key ay hindi nagbago sa rebuild, ang Element ay muling ginagamit, ina-update ang configuration nang hindi muling nililikha ang RenderObject. Tinitiyak nito ang pagganap ng Flutter sa mataas na frame rate (60/120 FPS).

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 Widgets')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Icon(Icons.flutter_dash, size: 80),
            const SizedBox(height: 16),
            const Text(
              'Kumusta, Flutter!',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

Puno ng widget ng HomeScreen: Scaffold → AppBar + Center → Column → [Icon, SizedBox, Text]. Scaffold — ang pangunahing layout widget ng Material Design. Nasa gitna ng Center ang child na Column. Inaayos ng Column ang mga anak nang patayo na may gitnang pagkakahanay (mainAxisAlignment.center). Kinakalkula ng Flutter ang layout mula sa itaas pababa (ang mga constraint ay ipinapasa mula sa parent) at ang mga laki mula sa ibaba pataas (sizedByParent o sizing from children).

BuildContext: konteksto ng build at access sa puno

BuildContext — deskriptor ng posisyon ng widget sa Element Tree. Bawat build() method ay tumatanggap ng BuildContext, kung saan ang widget ay makaka-access sa:MediaQuery (laki ng screen, oryentasyon, density ng pixel, safe area), Theme (MaterialThemeData o CupertinoThemeData), Navigator (navigation stack), ScaffoldMessenger (SnackBar), InheritedWidget (pagpasa ng data pababa sa puno). Ang BuildContext ay hindi dapat itago pagkatapos ng build() o gamitin sa labas ng synchronous context — ito ay humahantong sa mga error na “Scaffold.of() called with a context that does not contain a Scaffold”. Sa halip na itago ang context, gamitin ang Builder widget o InheritedWidget pattern para sa access sa data.

Key: pagkakakilanlan ng widget sa puno

Key — isang opsyonal na parameter ng constructor ng bawat widget (super.key). Tinutulungan ng Key ang Flutter na kilalanin ang widget sa pagbabago ng pagkakasunod-sunod/bilang ng mga elemento sa isang listahan. Kung walang key, ikinukumpara ng Flutter ang mga widget ayon sa uri at posisyon; kapag nagdagdag ng elemento sa gitna ng listahan nang walang key, muling ginagamit ng Flutter ang Element para sa maling widget, na nagdudulot ng mga bug sa estado (StatefulWidget) at animation. Gumamit ng ValueKey (natatanging identifier) para sa mga listahan, ObjectKey (batay sa data object), UniqueKey (garantisadong natatangi sa bawat rebuild — para sa sapilitang muling paggawa).

Katalogo ng widget ng Flutter: Material, Cupertino, Layout

Flutter SDK (stable na bersyon 3.3+, Dart 3+) ay may kasamang 200+ built-in na widget, nahahati sa mga kategorya: 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) at Accessibility (Semantics, MergeSemantics, ExcludeSemantics). Ang mga Layout widget ay pundasyon ng bawat Flutter UI: Row para sa pahalang na pagkakasunod-sunod, Column para sa patayo, Stack para sa magkakapatong na elemento, Container na may BoxDecoration para sa dekorasyon.

KategoryaPangunahing WidgetGamit
LayoutRow, Column, Stack, Container, Expanded, FlexiblePagpoposisyon at laki ng mga child element
MaterialScaffold, AppBar, Card, Drawer, FAB, TabBarMga bahagi ng UI Material Design 3
CupertinoCupertinoPageScaffold, CupertinoNavigationBar, CupertinoButtonMga bahaging naka-istilong iOS
PaintingOpacity, ClipRect, Transform, DecoratedBox, BackdropFilterMga visual effect at paggupit
AsyncFutureBuilder, StreamBuilderPag-load ng asynchronous na data na may mga UI status
AccessibilitySemantics, MergeSemanticsSemantikong pagmamarka para sa mga screen reader

Mga Madalas Itanong

Ano ang pagkakaiba ng StatelessWidget at StatefulWidget?

StatelessWidget ay walang panloob na estado — lahat ng data ay ipinapasa sa pamamagitan ng constructor at hindi nagbabago. Ang StatefulWidget ay nag-iimbak ng nababagong estado sa isang hiwalay na State object na nakaligtas sa rebuilds. Ang pagbabago ng estado ay tumatawag sa setState(), at muling binuo ng Flutter ang UI. Para sa hindi nababagong elemento, gamitin ang StatelessWidget; para sa interactive — StatefulWidget.

Ano ang BuildContext sa Flutter?

BuildContext — deskriptor ng posisyon ng widget sa Element Tree, na ipinapasa sa build() method. Sa pamamagitan ng context, ina-access ng widget ang MediaQuery, Theme, Navigator, ScaffoldMessenger, at InheritedWidget. Ang BuildContext ay hindi dapat itago pagkatapos ng build(). Para sa access sa data, gamitin ang Builder widget o InheritedWidget.

Kailangan bang malaman ang Dart para magtrabaho sa Flutter?

Oo, ginagamit ng Flutter ang Dart bilang tanging programming language. Ang Dart ay isang statically-typed language na may null-safety, sound types, extension methods, at pattern matching. Para magsimula, sapat na ang mga batayan ng Dart: classes, functions, async/await, collections. Ang Dart ay kino-compile sa native code (AOT) sa pamamagitan ng Dart Native at sa JavaScript (para sa web) sa pamamagitan ng Dart2JS.

Ang Flutter ba ay para lamang sa mga mobile platform?

Hindi, sinusuportahan ng Flutter ang anim na platform: iOS, Android, Web, macOS, Windows, Linux. Mahigit 90% ng code ay karaniwan sa lahat ng platform. Ang mga adaptasyon sa platform (camera, file system) ay ginagawa sa pamamagitan ng mga plugin o platform channels. Para sa desktop, ginagamit ng Flutter ang Flutter Desktop window wrapper; para sa web — CanvasKit engine (WebGL) o HTML renderer.

Paano tinitiyak ng Flutter ang performance na 60 FPS?

Naabot ng Flutter ang 60/120 FPS dahil sa: sarili nitong 2D engine (Skia/Impeller), kawalan ng native bridge (hindi tulad ng React Native), tatlong puno (Widget → Element → Render) na may muling paggamit ng Element sa hindi nagbabagong uri/key, layout algorithm na may one-directional pass (constraints down, sizes up), at RepaintBoundary para ihiwalay ang muling pagguhit ng mga indibidwal na zone ng screen.

Buod

  • Flutter Widgets — lahat ng UI elemento: mula Scaffold hanggang SizedBox; iginuhit sila ng Flutter mismo sa Skia/Impeller, nang hindi gumagamit ng native na mga bahagi.
  • StatelessWidget — widget na walang estado; ang build() ay nagbabalik ng UI batay sa hindi nababagong parameter ng constructor.
  • StatefulWidget — widget na may nababagong estado sa State; ang setState() ay nag-uudyok ng rebuild ng UI.
  • Tatlong puno ng Flutter: Widget (configuration) → Element (posisyon) → Render (layout + paint); ang Element ay muling ginagamit para sa performance.
  • BuildContext — posisyon ng widget sa puno; access sa MediaQuery, Theme, Navigator, InheritedWidget.
  • Material at Cupertino — dalawang set ng widget para sa Google Material Design 3 at Apple HIG.
  • Key (ValueKey, ObjectKey, UniqueKey) — pagkakakilanlan ng widget sa pagbabago ng pagkakasunod-sunod/bilang sa listahan.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din