Flutter Widgets — यह क्या है, विजेट ट्री और build

लेखक: IT Sectr प्रकाशित: 2026-02-21 पढ़ने का समय: 8 मिनट

Flutter Widgets — Google Flutter फ्रेमवर्क में उपयोगकर्ता इंटरफ़ेस के मूलभूत निर्माण खंड, जो दिसंबर 2018 में स्थिर संस्करण 1.0 में जारी किया गया था। Flutter में, सब कुछ एक विजेट है: स्क्रीन और बटन से लेकर पैडिंग और अलाइनमेंट तक। विजेट एक ट्री (widget tree) बनाते हैं, जिसे Flutter अपने स्वयं के Skia/Impeller इंजन पर रेंडर करता है, प्लेटफ़ॉर्म के मूल घटकों को दरकिनार करते हुए। Google I/O (2025) के अनुसार, Flutter का उपयोग Google Play और App Store में 500,000 से अधिक ऐप्स में किया जाता है। Flutter आर्किटेक्चर विजेट को StatelessWidget (अपरिवर्तनीय) और StatefulWidget (State ऑब्जेक्ट के माध्यम से परिवर्तनीय स्थिति वाले) में विभाजित करता है।

मुख्य बिंदु

  • Flutter Widgets — Flutter में सभी UI तत्व: स्क्रीन और बटन से लेकर पैडिंग और अलाइनमेंट तक; फ्रेमवर्क प्लेटफ़ॉर्म के मूल घटकों का उपयोग नहीं करता।
  • StatelessWidget — बिना परिवर्तनीय स्थिति वाला विजेट; कंस्ट्रक्टर के माध्यम से पास किए गए डेटा को प्रदर्शित करता है और build के बाद नहीं बदलता।
  • StatefulWidget — एक अलग State ऑब्जेक्ट में संग्रहीत परिवर्तनीय स्थिति वाला विजेट जो रीबिल्ड से बच जाता है।
  • विजेट ट्री (widget tree) — UI का वर्णन करने वाले विजेट का पदानुक्रम; Flutter इसे रेंडरिंग के लिए Element Tree और Render Tree में बदल देता है।
  • BuildContext — बिल्ड संदर्भ जो ट्री में विजेट की स्थिति, थीम, MediaQuery और InheritedWidget तक पहुँच प्रदान करता है।

Flutter Widgets क्या हैं?

Flutter Widgets — Flutter फ्रेमवर्क में सभी UI तत्व, अपरिवर्तनीय (immutable) Dart कक्षाओं के रूप में कार्यान्वित। विजेट एक UI तत्व का कॉन्फ़िगरेशन है: इसका आकार, रंग, स्थिति और ईवेंट हैंडलर। Android (XML + View) या iOS (Storyboard + UIView) के विपरीत, Flutter मूल घटकों का उपयोग नहीं करता — सब कुछ Canvas पर Skia (Android/iOS/Linux) या Impeller (iOS/macOS) इंजन द्वारा खींचा जाता है। यह बिना प्लेटफ़ॉर्म भिन्नता के सभी प्लेटफ़ॉर्म पर एक समान रूप सुनिश्चित करता है। Flutter विजेट के दो सेटों के साथ आता है: Material Widgets (Android/वेब के लिए Google Material Design 3) और Cupertino Widgets (iOS/macOS के लिए Apple HIG)। डेवलपर एक ही एप्लिकेशन में दोनों सेटों को जोड़ सकता है। प्रत्येक विजेट में build() विधि होती है जो एक चाइल्ड विजेट या उनकी संरचना लौटाती है — इस प्रकार विजेट ट्री बनाया जाता है।

Flutter के तीन ट्री

Flutter तीन ट्री के साथ काम करता है: Widget Tree (कॉन्फ़िगरेशन, डेवलपर द्वारा बनाया गया), Element Tree (ट्री में विजेट की स्थिति का मैपिंग, फ्रेमवर्क द्वारा प्रबंधित) और Render Tree (ऑब्जेक्ट जो लेआउट की गणना करते हैं और पेंटिंग करते हैं)। एक Widget एक Element बनाता है, जो एक RenderObject बनाता है। कॉन्फ़िगरेशन बदलने (rebuild) पर Element का पुन: उपयोग किया जाता है — यह Flutter का अनुकूलन तंत्र है: यदि विजेट का प्रकार और key मेल खाते हैं, तो Element पुन: नहीं बनाया जाता, बल्कि नए कॉन्फ़िगरेशन के साथ अपडेट किया जाता है। तीन ट्री को समझना Flutter एप्लिकेशन के प्रदर्शन को अनुकूलित करने की कुंजी है।

StatelessWidget: अपरिवर्तनीय विजेट

StatelessWidget — एक विजेट जो आंतरिक स्थिति संग्रहीत नहीं करता। यह कंस्ट्रक्टर के माध्यम से पैरामीटर प्राप्त करता है और build के बाद बदलने की क्षमता के बिना उन्हें प्रदर्शित करता है। StatelessWidget स्थैतिक तत्वों के लिए आदर्श है: शीर्षक, आइकन, अवतार, निश्चित डेटा वाली सूचियाँ। build() विधि निर्माण के समय और जब पैरेंट विजेट बदलता है, एक बार कॉल की जाती है। चूंकि StatelessWidget की कोई स्थिति नहीं है, इसे अलग State ऑब्जेक्ट की आवश्यकता नहीं है — build() सीधे विजेट क्लास में परिभाषित किया जाता है।

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 — एक StatelessWidget जो कंस्ट्रक्टर के माध्यम से name और avatarUrl प्राप्त करता है। CircleAvatar अवतार प्रदर्शित करता है, Text नाम प्रदर्शित करता है। विजेट निर्माण के बाद इन मानों को नहीं बदल सकता। const कंस्ट्रक्टर (const ProfileHeader) का उपयोग Flutter को पैरेंट रीबिल्ड के दौरान विजेट इंस्टेंस का पुन: उपयोग करने की अनुमति देता है — सभी StatelessWidget के लिए अनुशंसित एक माइक्रो-ऑप्टिमाइज़ेशन।

StatefulWidget: स्थिति वाले विजेट

StatefulWidget — एक अलग State ऑब्जेक्ट में संग्रहीत परिवर्तनीय स्थिति वाला विजेट। StatefulWidget स्वयं अपरिवर्तनीय है, StatelessWidget की तरह। परिवर्तनीय भाग State को सौंपा गया है: State एक ऑब्जेक्ट है जो एक बार बनाया जाता है और कई विजेट रीबिल्ड से बच जाता है। जब स्थिति बदलती है (setState()), Flutter State पर build() कॉल करता है, UI को अपडेट करता है। StatefulWidget का उपयोग इंटरैक्टिव तत्वों के लिए किया जाता है: काउंटर, टेक्स्ट फ़ील्ड, चेकबॉक्स, एनिमेशन, टाइमर।

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 क्लास _LikeButtonState के साथ एक StatefulWidget। फ़ील्ड liked और count State में संग्रहीत स्थिति हैं और रीबिल्ड पर रीसेट नहीं होते। setState() Flutter को सूचित करता है कि UI को पुनर्निर्माण की आवश्यकता है। Flutter प्रत्येक पैरेंट रीबिल्ड पर State को पुन: नहीं बनाता — केवल जब कॉन्फ़िगरेशन (key या विजेट प्रकार) बदलता है। IT Sectr में, हम प्रदर्शन के लिए StatelessWidget और इंटरैक्टिव घटकों के लिए StatefulWidget का उपयोग करते हैं, म्यूटेशन की सीमाओं तक StatefulWidget को कम करने के सिद्धांत का पालन करते हुए।

विजेट ट्री: Widget से RenderObject तक

Widget Tree — एप्लिकेशन UI का वर्णन करने वाले विजेट की पदानुक्रमित संरचना। Flutter Widget Tree को Element Tree में परिवर्तित करता है: प्रत्येक Widget एक Element बनाता है, जो ट्री में अपनी स्थिति और RenderObject से कनेक्शन को ट्रैक करता है। Render Tree लेआउट (आकार और स्थिति निर्धारण) और पेंट (रेंडरिंग) करता है। Element एक महत्वपूर्ण अनुकूलन परत है: यदि रीबिल्ड के दौरान विजेट प्रकार और key नहीं बदले हैं, तो Element का पुन: उपयोग किया जाता है, RenderObject को पुन: बनाए बिना कॉन्फ़िगरेशन अपडेट किया जाता है। यह उच्च फ्रेम दर (60/120 FPS) पर Flutter के प्रदर्शन को सुनिश्चित करता है।

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 विजेट')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Icon(Icons.flutter_dash, size: 80),
            const SizedBox(height: 16),
            const Text(
              'नमस्ते, Flutter!',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

HomeScreen विजेट ट्री: Scaffold → AppBar + Center → Column → [Icon, SizedBox, Text]। Scaffold मूल Material Design लेआउट विजेट है। Center अपने चाइल्ड Column को केंद्रित करता है। Column चिल्ड्रन को केंद्र संरेखण (mainAxisAlignment.center) के साथ लंबवत रूप से व्यवस्थित करता है। Flutter लेआउट की गणना ऊपर से नीचे (पैरेंट से constraints पास किए जाते हैं) और आकार नीचे से ऊपर (sizedByParent या चिल्ड्रन से साइज़िंग) करता है।

BuildContext: बिल्ड संदर्भ और ट्री तक पहुँच

BuildContext — Element Tree में विजेट की स्थिति का एक वर्णनकर्ता। प्रत्येक build() विधि एक BuildContext प्राप्त करती है, जिसके माध्यम से विजेट पहुँच सकता है: MediaQuery (स्क्रीन आकार, ओरिएंटेशन, पिक्सेल घनत्व, सुरक्षित क्षेत्र), Theme (MaterialThemeData या CupertinoThemeData), Navigator (नेविगेशन स्टैक), ScaffoldMessenger (SnackBar), InheritedWidget (ट्री में नीचे डेटा पास करना)। BuildContext को build() पूरा होने के बाद सहेजा नहीं जाना चाहिए या सिंक्रोनस संदर्भ के बाहर उपयोग नहीं किया जाना चाहिए — इससे “Scaffold.of() called with a context that does not contain a Scaffold” जैसी त्रुटियाँ होती हैं। कॉन्टेक्स्ट को सहेजने के बजाय, डेटा तक पहुँच के लिए Builder विजेट या InheritedWidget पैटर्न का उपयोग करें।

Key: ट्री में विजेट की पहचान

Key — प्रत्येक विजेट के कंस्ट्रक्टर का एक वैकल्पिक पैरामीटर (super.key)। Key Flutter को सूची में आइटम के क्रम या संख्या बदलने पर विजेट की पहचान करने में मदद करता है। Key के बिना, Flutter विजेट की तुलना प्रकार और स्थिति से करता है; Key के बिना सूची के बीच में एक आइटम जोड़ने पर, Flutter गलत विजेट के लिए Element का पुन: उपयोग करता है, जिससे स्थिति संबंधी बग (StatefulWidget) और एनिमेशन समस्याएँ होती हैं। सूचियों के लिए ValueKey (अद्वितीय पहचानकर्ता), ObjectKey (डेटा ऑब्जेक्ट पर आधारित), UniqueKey (प्रत्येक रीबिल्ड पर गारंटीकृत अद्वितीय — बलपूर्वक पुनर्निर्माण के लिए) का उपयोग करें।

Flutter विजेट कैटलॉग: Material, Cupertino, Layout

Flutter SDK (स्थिर संस्करण 3.3+, Dart 3+) में 200+ अंतर्निहित विजेट श्रेणियों में विभाजित हैं: 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) और Accessibility (Semantics, MergeSemantics, ExcludeSemantics)। लेआउट विजेट किसी भी Flutter UI की नींव हैं: Row क्षैतिज अनुक्रमों के लिए, Column लंबवत के लिए, Stack ओवरलैपिंग तत्वों के लिए, सजावट के लिए BoxDecoration के साथ Container।

श्रेणीमुख्य विजेटउद्देश्य
LayoutRow, Column, Stack, Container, Expanded, Flexibleचाइल्ड तत्वों की स्थिति और आकार निर्धारण
MaterialScaffold, AppBar, Card, Drawer, FAB, TabBarMaterial Design 3 UI घटक
CupertinoCupertinoPageScaffold, CupertinoNavigationBar, CupertinoButtoniOS-शैली वाले घटक
PaintingOpacity, ClipRect, Transform, DecoratedBox, BackdropFilterदृश्य प्रभाव और क्लिपिंग
AsyncFutureBuilder, StreamBuilderUI स्थितियों के साथ एसिंक्रोनस डेटा लोडिंग
AccessibilitySemantics, MergeSemanticsस्क्रीन रीडर के लिए सिमैंटिक मार्कअप

अक्सर पूछे जाने वाले प्रश्न

StatelessWidget StatefulWidget से कैसे अलग है?

StatelessWidget की कोई आंतरिक स्थिति नहीं है — सभी डेटा कंस्ट्रक्टर के माध्यम से पास किया जाता है और बदलता नहीं है। StatefulWidget एक अलग State ऑब्जेक्ट में परिवर्तनीय स्थिति संग्रहीत करता है जो रीबिल्ड से बच जाता है। स्थिति बदलने पर setState() कॉल होता है, और Flutter UI का पुनर्निर्माण करता है। अपरिवर्तनीय तत्वों के लिए StatelessWidget का उपयोग करें; इंटरैक्टिव तत्वों के लिए StatefulWidget का उपयोग करें।

Flutter में BuildContext क्या है?

BuildContext Element Tree में विजेट की स्थिति का एक वर्णनकर्ता है, जो build() विधि को पास किया जाता है। कॉन्टेक्स्ट के माध्यम से, विजेट MediaQuery, Theme, Navigator, ScaffoldMessenger और InheritedWidget तक पहुँच प्राप्त करता है। BuildContext को build() पूरा होने के बाद सहेजा नहीं जाना चाहिए। डेटा तक पहुँच के लिए, Builder विजेट या InheritedWidget का उपयोग करें।

क्या Flutter के साथ काम करने के लिए Dart जानना आवश्यक है?

हाँ, Flutter Dart को अपनी एकमात्र प्रोग्रामिंग भाषा के रूप में उपयोग करता है। Dart एक स्थिर रूप से टाइप की गई भाषा है जिसमें null safety, sound null safety, extension methods और pattern matching है। शुरू करने के लिए, Dart की मूल बातें पर्याप्त हैं: कक्षाएं, फ़ंक्शन, async/await, संग्रह। Dart Dart Native के माध्यम से मूल कोड (AOT) में और Dart2JS के माध्यम से JavaScript (वेब के लिए) में संकलित होता है।

क्या Flutter केवल मोबाइल प्लेटफ़ॉर्म के लिए है?

नहीं, Flutter छह प्लेटफ़ॉर्म का समर्थन करता है: iOS, Android, Web, macOS, Windows, Linux। 90% से अधिक कोड सभी प्लेटफ़ॉर्म पर साझा होता है। प्लेटफ़ॉर्म अनुकूलन (कैमरा, फ़ाइल सिस्टम) प्लगइन या प्लेटफ़ॉर्म चैनल के माध्यम से कार्यान्वित किए जाते हैं। डेस्कटॉप के लिए, Flutter Flutter Desktop विंडो शेल का उपयोग करता है; वेब के लिए, यह CanvasKit (WebGL) या HTML रेंडरर का उपयोग करता है।

Flutter 60 FPS का प्रदर्शन कैसे प्राप्त करता है?

Flutter 60/120 FPS प्राप्त करता है: अपने स्वयं के 2D इंजन (Skia/Impeller), मूल ब्रिज की अनुपस्थिति (React Native के विपरीत), तीन ट्री (Widget → Element → Render) प्रकार/key अपरिवर्तित रहने पर Element पुन: उपयोग के साथ, एक-दिशीय पास के साथ लेआउट एल्गोरिदम (constraints नीचे, sizes ऊपर) और स्क्रीन के अलग-अलग क्षेत्रों के पुन: पेंटिंग को अलग करने के लिए RepaintBoundary के माध्यम से।

सारांश

  • Flutter Widgets — सभी UI तत्व: Scaffold से SizedBox तक; Flutter उन्हें स्वयं Skia/Impeller पर रेंडर करता है, मूल घटकों का उपयोग किए बिना।
  • StatelessWidget — बिना स्थिति वाला विजेट; build() अपरिवर्तनीय कंस्ट्रक्टर पैरामीटर पर आधारित UI लौटाता है।
  • StatefulWidget — State में परिवर्तनीय स्थिति वाला विजेट; setState() UI रीबिल्ड को ट्रिगर करता है।
  • Flutter के तीन ट्री: Widget (कॉन्फ़िगरेशन) → Element (स्थिति) → Render (लेआउट + पेंट); प्रदर्शन के लिए Element का पुन: उपयोग किया जाता है।
  • BuildContext — ट्री में विजेट की स्थिति; MediaQuery, Theme, Navigator, InheritedWidget तक पहुँच।
  • Material और Cupertino — क्रमशः Google Material Design 3 और Apple HIG के लिए दो विजेट सेट।
  • Key (ValueKey, ObjectKey, UniqueKey) — सूची में क्रम या मात्रा बदलने पर विजेट की पहचान।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें