स्पंदन में स्टेटफुल और स्टेटलेस विजेट्स का क्या संबंध है?


104

एक स्टेटफुल विजेट को किसी भी विजेट के रूप में परिभाषित किया जाता है जो अपने जीवनकाल के भीतर अपनी स्थिति को बदल देता है। लेकिन यह एक बहुत ही आम बात एक के लिए है StatelessWidgetएक के लिए StatefulWidgetअपने बच्चों में से एक के रूप में। StatelessWidgetअगर यह StatefulWidgetउसके बच्चों में से एक के रूप में राज्य नहीं बनता है ?

मैंने दस्तावेज़ीकरण को कोड के भाग के रूप में देखने की कोशिश की StatelessWidget, लेकिन यह पता नहीं लगा सका कि इसके बच्चे कैसे StatelessWidgetहो सकते हैं Statefulwidgetऔर अभी भी बने हुए हैं StatelessWidget

स्पंदन में स्टेटफुल और स्टेटलेस विजेट्स के बीच क्या संबंध और अंतर है?


2
आप अपने लेआउट को विभिन्न प्रकार के विजेट से बना सकते हैं, हालांकि इसका मतलब यह नहीं है कि आप प्रत्येक विजेट को प्रभावित करने के लिए संरचना की विशेषताओं को विरासत में प्राप्त कर रहे हैं। मेरा मतलब है कि आपके पास एक कंटेनर हो सकता है, जो स्टेटलेस है, जिसमें एक और कंटेनर का बच्चा है जिसे स्टेटफुलवेट के रूप में कहीं और घोषित किया गया है, कंटेनर की स्थिति केवल इस एक घटक को प्रभावित करेगी। इसलिए, यह विभिन्न प्रकार के विजेट से एक रचना होने के बारे में है, प्रत्येक फ़ंक्शन को आपको उनकी आवश्यकता है।
अज़ीज़ा

1
चीजों को और अधिक गड़बड़ करने के लिए, एक 3 प्रकार का विजेट है InheritedWidget:; जो StatelessWidgetअपडेट कर सकता है ।
रेमी रूसेलेट

जवाबों:


103

एक स्टेटलेसविजेट अपने आप से कभी भी पुनर्निर्माण नहीं करेगा (लेकिन बाहरी घटनाओं से)। एक StatefulWidget कर सकते हैं। वह स्वर्णिम नियम है।

लेकिन किसी भी तरह के विजेट को किसी भी समय रिपीट किया जा सकता है ।

स्टेटलेस केवल इसका मतलब है कि इसके सभी गुण अपरिवर्तनीय हैं और उन्हें बदलने का एकमात्र तरीका उस विजेट का एक नया उदाहरण बनाना है। यह उदाहरण के लिए विजेट ट्री को लॉक नहीं करता है।

लेकिन आपको इस बात की परवाह नहीं करनी चाहिए कि आपके बच्चों का प्रकार क्या है। इसका आप पर कोई प्रभाव नहीं पड़ता है।


11
(फ्रेमवर्क से अपेक्षाकृत नया)। बीच क्या अंतर है rebuildऔरrepaint
user462455

स्पंदन फ्रेमवर्क कोड में टिप्पणियों से, जाहिर तौर पर StateFulWidgetएस अपरिवर्तनीय भी हैं।
user462455

3
विजेट का निर्माण मूल रूप से "बिल्ड" विधि के लिए एक कॉल है, इसके बाद संबंधित रेंडरबॉक्स को बनाने / अपडेट करने के बाद; जिसके बाद पेंटिंग प्रक्रिया होती है। जो इन रेंडरबॉक्स को स्क्रीन पर प्रिंट करेगा।
रेमी रूसेलेट 5

"StatefulWidget" विरासत में मिलने वाली कक्षाएं अपरिवर्तनीय हैं। लेकिन राज्य (राज्य <YourWidget>) स्वयं परिवर्तनशील है।
रेमी रूसेलेट 5

1
@ RémiRousselet स्टेटफुल और स्टेटलेस विगेट्स, दोनों हर फ्रेम का पुनर्निर्माण करते हैं, flutter.dev/docs/get-started/flutter-for/… के
मैट

82

स्टेटफुलविडेट बनाम स्टेटलेसविजेट।

यहाँ छवि विवरण दर्ज करें

स्टेटलेसविजेट - एक विजेट जिसे परस्पर अवस्था की आवश्यकता नहीं होती है।

  • एक स्टेटलेस विजेट एक विजेट है जो उपयोगकर्ता इंटरफ़ेस के एक तारामंडल का निर्माण करके अन्य इंटरफेस का वर्णन करता है जो उपयोगकर्ता इंटरफ़ेस का अधिक संक्षिप्त वर्णन करता है। उपयोगकर्ता इंटरफ़ेस का वर्णन पूरी तरह से ठोस होने तक भवन निर्माण की प्रक्रिया लगातार होती रहती है (जैसे, पूरी तरह से RenderObjectWidgets, जिसमें कंक्रीट RenderObjects का वर्णन होता है)।

  • statelessजब यूजर इंटरफेस आप का वर्णन कर रहे हैं का हिस्सा वस्तु ही है और में कॉन्फ़िगरेशन जानकारी के अलावा और कुछ पर निर्भर नहीं करता विजेट उपयोगी है BuildContext जिसमें विजेट फुलाया जाता है। ऐसी रचनाओं के लिए जो गतिशील रूप से बदल सकती हैं, जैसे कि आंतरिक घड़ी से संचालित होने के कारण, या कुछ सिस्टम स्थिति के आधार पर, उपयोग करने पर विचार करें StatefulWidget

class GreenFrog extends StatelessWidget {
  const GreenFrog({ Key key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(color: const Color(0xFF2DBD3A));
  }
}

StatefulWidget - एक विजेट जिसमें परिवर्तनशील स्थिति होती है।

  • स्टेटफुल विजेट तब उपयोगी होते हैं जब आपके द्वारा बताए जा रहे यूजर इंटरफेस का हिस्सा गतिशील रूप से बदल सकता है।

जब स्पंदन एक बनाता है StatefulWidget, यह एक राज्य वस्तु बनाता है। यह ऑब्जेक्ट उस विजेट के लिए सभी उत्परिवर्तनीय स्थिति को आयोजित करता है।

राज्य की अवधारणा दो चीजों से परिभाषित होती है:

1) विजेट द्वारा उपयोग किया जाने वाला डेटा बदल सकता है।

2) जब विजेट बनाया जाता है तो डेटा को सिंक्रोनाइज़ नहीं किया जा सकता है। (सभी राज्य को उस समय तक स्थापित किया जाना चाहिए जब निर्माण विधि कहा जाता है)।

StatefulWidget जीवनचक्र

जीवनचक्र में निम्नलिखित सरलीकृत चरण हैं:

  1. createState () - जब Flutter को StatefulWidget बनाने का निर्देश दिया जाता है, तो वह तुरंत कॉल करता है createState()
  • पेड़ में दिए गए स्थान पर इस विजेट के लिए परिवर्तनशील स्थिति बनाता है।

  • उपवर्गों को अपने संबंधित राज्य उपवर्ग के एक नए बनाए गए उदाहरण को वापस करने के लिए इस विधि को ओवरराइड करना चाहिए:

@override
_MyState createState() => _MyState();
  1. आरोहित == सत्य - सभी विगेट्स के पास एक बूल this.mountedप्रॉपर्टी है। buildContextअसाइन किए जाने पर यह सही हो जाता है । setStateविजेट अनमाउंट होने पर कॉल करना एक त्रुटि है । क्या यह राज्य वस्तु वर्तमान में एक पेड़ में है।
  • स्टेट ऑब्जेक्ट बनाने और कॉल करने से पहले initState, फ्रेमवर्क स्टेट ऑब्जेक्ट को "a" से जोड़कर "mounts" करता है
    BuildContext। जब तक फ्रेमवर्क
    कॉल नहीं करता dispose(), तब तक राज्य ऑब्जेक्ट माउंटेड रहता है , जिसके बाद फ्रेमवर्क
    स्टेट ऑब्जेक्ट को फिर से बनाने के लिए नहीं कहेगा ।

  • जब तक घुड़सवार सही न हो, तब तक सेटस्टेट को कॉल करना एक त्रुटि है।

bool get mounted => _element != null;
  1. initState () - यह पहला तरीका है जिसे विजेट बनाया जाता है (क्लास कंस्ट्रक्टर के बाद, निश्चित रूप से)।

initStateएक बार और केवल एक बार कहा जाता है। इसे कॉल करना होगाsuper.initState().

  • विजेट के बनाए गए उदाहरण के लिए विशिष्ट BuildContext पर निर्भर डेटा को प्रारंभ करें।

  • पेड़ पर इन विगेट्स 'माता-पिता' पर भरोसा करने वाले गुणों को प्रारंभिक करें।

  • स्ट्रीम, ChangeNotifiersया किसी भी अन्य ऑब्जेक्ट की सदस्यता लें जो इस विजेट पर डेटा को बदल सकती है।

@override
initState() {
  super.initState();
  // Add listeners to this class
  cartItemStream.listen((data) {
    _updateWidget(data);
  });
}
  1. didChangeDependencies () - जब इस राज्य ऑब्जेक्ट की निर्भरता में परिवर्तन होता है, तो कॉल किया जाता है।
  • इस विधि को तुरंत बाद भी कहा जाता है initStateBuildContext.inheritFromWidgetOfExactTypeइस विधि से कॉल करना सुरक्षित है ।

  • उप-वर्ग शायद ही कभी इस पद्धति को ओवरराइड करते हैं क्योंकि ढांचा हमेशा निर्भरता में बदलाव के बाद निर्मित होता है। कुछ उपवर्ग इस पद्धति को ओवरराइड करते हैं, क्योंकि जब वे अपनी निर्भरता बदलते हैं तो उन्हें कुछ महंगे काम करने होते हैं (जैसे, नेटवर्क लाने के लिए), और यह काम हर बिल्ड के लिए करना बहुत महंगा होगा।

@protected
@mustCallSuper
void didChangeDependencies() { }
  1. build () - विजेट द्वारा दर्शाए गए यूजर इंटरफेस के हिस्से का वर्णन करता है।

फ्रेमवर्क इस विधि को विभिन्न स्थितियों में कहता है:

  • कॉल करने के बाद initState
  • कॉल करने के बाद didUpdateWidget
  • करने के लिए एक कॉल प्राप्त करने के बाद setState
  • इस राज्य वस्तु परिवर्तनों की निर्भरता के बाद (जैसे, पिछले निर्माण परिवर्तनों द्वारा संदर्भित InheritedWidget)।
  • कॉल निष्क्रिय करने के बाद और फिर किसी अन्य स्थान पर पेड़ में राज्य वस्तु को फिर से स्थापित करना।
  • इस विधि द्वारा दिए गए विजेट के साथ, फ्रेमवर्क इस विजेट के नीचे के सबट्री को बदल देता है, या तो मौजूदा सबट्री को अपडेट करके या सबट्री को हटाकर और एक नई सबट्री को फुलाकर, इस पद्धति से लौटाए गए विजेट के आधार पर मौजूदा सबट्री के रूट को अपडेट कर सकता है या नहीं , जैसा कि फोन करके निर्धारित किया जाता है Widget.canUpdate

  • आमतौर पर कार्यान्वयन विगेट्स के एक नए बनाए गए तारामंडल को लौटाते हैं जो इस विजेट के निर्माता, दिए गए बिल्डकनेक्ट , और इस राज्य ऑब्जेक्ट की आंतरिक स्थिति से जानकारी के साथ कॉन्फ़िगर किए गए हैं ।

@override
  Widget build(BuildContext context, MyButtonState state) {
    ... () { print("color: $color"); } ...
  }
  1. didUpdateWidget () - जब भी विजेट कॉन्फ़िगरेशन बदलता है, तब कॉल किया जाता है।
  • यदि पैरेंट विजेट पुनर्निर्मित करता है और अनुरोध करता है कि ट्री में यह स्थान उसी रनटाइम प्रकार और विजेट .key के साथ एक नया विजेट प्रदर्शित करने के लिए अपडेट करता है, तो फ्रेमवर्क इस स्टेट ऑब्जेक्ट की विजेट प्रॉपर्टी को नए विजेट को संदर्भित करने के लिए अपडेट करेगा और फिर इसे कॉल करेगा। एक तर्क के रूप में पिछले विजेट के साथ विधि।

  • जब विजेट बदलता है (उदाहरण के लिए अंतर्निहित एनिमेशन शुरू करने के लिए) प्रतिक्रिया देने के लिए इस विधि को ओवरराइड करें।

  • हमेशा किए गए कॉल के बाद फ्रेमवर्क कॉल किया जाता है, जिसका अर्थ है कि डुपडेटटेड में सेटस्टैट करने के लिए कोई भी कॉल निरर्थक है।

@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
  1. setState () - जब भी आप किसी स्टेट ऑब्जेक्ट की आंतरिक स्थिति को बदलते हैं, तो उस फ़ंक्शन में बदलाव करें जिसे आप पास करते हैं setState:
  • कॉलिंग सेटस्टैट उस रूपरेखा को सूचित करता है कि इस वस्तु की आंतरिक स्थिति इस तरह से बदल गई है जो इस उपप्रकार में उपयोगकर्ता इंटरफ़ेस को प्रभावित कर सकती है, जो
    इस राज्य वस्तु के लिए रूपरेखा का निर्माण करने का कारण बनता है ।

  • यदि आप सेटस्टैट को कॉल किए बिना सीधे राज्य को बदलते हैं , तो फ्रेमवर्क एक बिल्ड शेड्यूल नहीं कर सकता है और इस सबट्री के लिए यूजर इंटरफेस नए राज्य को प्रतिबिंबित करने के लिए अपडेट नहीं किया जा सकता है।

setState(() { _myState = newValue });
  1. निष्क्रिय () - निष्क्रियता उस स्थिति को कहा जाता है जब राज्य को पेड़ से हटा दिया जाता है, लेकिन वर्तमान फ्रेम परिवर्तन समाप्त होने से पहले इसे फिर से स्थापित किया जा सकता है। यह विधि मूल रूप से मौजूद है क्योंकि राज्य वस्तुओं को एक पेड़ से दूसरे बिंदु पर स्थानांतरित किया जा सकता है।
  • जब भी वह इस स्टेट ऑब्जेक्ट को ट्री से हटाता है, तो फ्रेमवर्क इस विधि को कॉल करता है। कुछ मामलों में, फ्रेमवर्क स्टेट ऑब्जेक्ट को ट्री के दूसरे हिस्से में फिर से इंस्टॉल करेगा (जैसे, अगर इस स्टेट ऑब्जेक्ट वाली सबट्री को ट्री के एक स्थान से दूसरे में ग्राफ्ट किया जाता है)। यदि ऐसा होता है, तो रूपरेखा यह सुनिश्चित करेगी कि यह राज्य में वस्तु को पेड़ में अपने नए स्थान के अनुकूल होने का मौका देने के लिए निर्माण का आह्वान करे। यदि फ्रेमवर्क इस सबट्री को फिर से स्थापित करता है, तो यह एनीमेशन फ्रेम के अंत से पहले ऐसा करेगा जिसमें सबट्री को पेड़ से हटा दिया गया था। इस कारण से, राज्य वस्तुएं अधिकांश संसाधनों को जारी करने से रोक सकती हैं जब तक कि फ्रेम उनके निपटान के तरीके को नहीं बुलाता है।

यह शायद ही कभी इस्तेमाल किया जाता है।

@protected
@mustCallSuper
void deactivate() { }
  1. dispose () - इस ऑब्जेक्ट को स्थायी रूप से पेड़ से हटाए जाने पर कॉल किया जाता है।
  • जब यह राज्य ऑब्जेक्ट फिर से कभी नहीं बनेगा, तो फ्रेमवर्क इस विधि को कॉल करता है। फ्रेमवर्क कॉल के बाद dispose(), स्टेट ऑब्जेक्ट को अनमाउंट माना जाता है और माउंटेड संपत्ति झूठी है। इस बिंदु पर सेटस्टेट को कॉल करना एक त्रुटि है। जीवनचक्र का यह चरण टर्मिनल है: किसी राज्य वस्तु को हटाने का कोई तरीका नहीं है जिसका निपटान किया गया है।

  • उपवर्गों को इस ऑब्जेक्ट द्वारा बनाए गए किसी भी संसाधन को जारी करने के लिए इस विधि को ओवरराइड करना चाहिए (जैसे, किसी भी सक्रिय एनिमेशन को रोकना)।

@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}

यहाँ छवि विवरण दर्ज करें

अधिक जानकारी के लिए जाना यहाँ यहाँ , यहाँ


26

प्रलेखन से flutter.io पर :

... यहां ध्यान देने वाली महत्वपूर्ण बात यह है कि स्टेट में स्टेटलेस और स्टेटफुल विजेट दोनों समान हैं। वे हर फ्रेम का पुनर्निर्माण करते हैं, अंतर यह है कि स्टेटफुलवेट में एक स्टेट ऑब्जेक्ट होता है जो फ़्रेम में राज्य डेटा संग्रहीत करता है और इसे पुनर्स्थापित करता है।

यदि आप संदेह में हैं, तो हमेशा इस नियम को याद रखें: यदि कोई विजेट बदलता है (उपयोगकर्ता इसके साथ सहभागिता करता है, उदाहरण के लिए) यह स्टेटफुल है। हालाँकि, यदि कोई बच्चा बदलने के लिए प्रतिक्रिया दे रहा है, तो अभिभावक परिवर्तन के लिए प्रतिक्रिया नहीं करता है, तो अभिभावक अभी भी स्टेटलेस विजेट हो सकता है।


14

जैसा कि स्पंदन डॉक्स में बताया गया है

क्या बात है?

कुछ विजेट स्टेटफुल हैं, और कुछ स्टेटलेस हैं। यदि कोई विजेट बदलता है, तो उपयोगकर्ता इसके साथ इंटरैक्ट करता है, उदाहरण के लिए- यह स्टेटफुल है। एक विजेट की स्थिति में ऐसे मान होते हैं जो स्लाइडर के वर्तमान मूल्य की तरह बदल सकते हैं या चेकबॉक्स की जांच कर सकते हैं। एक विजेट राज्य को एक वस्तु में संग्रहीत किया जाता है, विजेट की स्थिति को उसके स्वरूप से अलग करता है। जब विजेट की स्थिति बदल जाती है, तो राज्य ऑब्जेक्ट सेटस्ट्रेट () को कहता है, विजेट को फिर से तैयार करने के लिए रूपरेखा बता रहा है।

एक स्टेटलेस विजेट का प्रबंधन करने के लिए कोई आंतरिक स्थिति नहीं है। Icon, IconButton, और Text स्टेटलेस विजेट्स के उदाहरण हैं, जो स्टेटलेसविजेट को उपवर्गित करते हैं।

एक स्टेटफुल विजेट गतिशील है। उपयोगकर्ता एक स्टेटफुल विजेट (एक फॉर्म में टाइप करके, या एक स्लाइडर को स्थानांतरित करके, उदाहरण के लिए) के साथ बातचीत कर सकता है, या यह समय के साथ बदलता है (शायद एक डेटा फीड यूआई को अपडेट करने का कारण बनता है)। चेकबॉक्स, रेडियो, स्लाइडर, इंकवेल, फॉर्म, और टेक्स्टफिल्ड स्टेटफुल विजेट्स के उदाहरण हैं, जो स्टेटफुलवेट को उपवर्ग करते हैं।

https://flutter.io/tutorials/interactive/#stateful-stateless


10

राज्य सूचना है कि (1) को विजेट के निर्माण के दौरान सिंक्रोनस से पढ़ा जा सकता है और (2) विजेट के जीवनकाल के दौरान बदल सकता है। यह सुनिश्चित करने के लिए विजेट कार्यान्वयनकर्ता की जिम्मेदारी है कि राज्य को तुरंत सूचित किया जाए जब राज्य में इस तरह के परिवर्तन होते हैं।

स्टेटफुलवेट :

एक स्टेटफुल विजेट एक विजेट है जो यूजर इंटरफेस के एक तारामंडल का निर्माण करके अन्य इंटरफेस का वर्णन करता है जो उपयोगकर्ता इंटरफ़ेस का अधिक संक्षिप्त वर्णन करता है। उपयोगकर्ता इंटरफ़ेस का वर्णन पूरी तरह से ठोस होने तक भवन निर्माण की प्रक्रिया लगातार होती रहती है (जैसे, पूरी तरह से RenderObjectWidgets, जिसमें कंक्रीट RenderObjects का वर्णन होता है)।

स्टेटफुल विजेट तब उपयोगी होता है जब आप जिस यूजर इंटरफेस का वर्णन कर रहे हैं उसका हिस्सा डायनामिक रूप से बदल सकता है, जैसे कि आंतरिक क्लॉक-संचालित स्थिति होने के कारण, या कुछ सिस्टम स्थिति के आधार पर। ऐसी रचनाएँ जो केवल ऑब्जेक्ट में कॉन्फ़िगरेशन जानकारी पर निर्भर करती हैं और BuildContext जिसमें विजेट को फुलाया जाता है, StatlessWidget का उपयोग करने पर विचार करें।

StatefulWidget के उदाहरण स्वयं अपरिवर्तनीय हैं और अपनी उत्परिवर्तित अवस्था को या तो अलग-अलग स्थिति में संग्रहीत करते हैं, जो createState विधि द्वारा बनाई गई हैं, या उन वस्तुओं के लिए जिनमें स्टेट सब्सक्राइब करता है, उदाहरण के लिए स्ट्रीम या ChangeNotifier ऑब्जेक्ट, जिसके लिए StatefulWidget पर अंतिम फ़ील्ड में संदर्भ संग्रहीत किए जाते हैं। अपने आप।

स्टेटलेसविजेट :

एक स्टेटलेस विजेट एक विजेट है जो उपयोगकर्ता इंटरफ़ेस के एक तारामंडल का निर्माण करके अन्य इंटरफेस का वर्णन करता है जो उपयोगकर्ता इंटरफ़ेस का अधिक संक्षिप्त वर्णन करता है। उपयोगकर्ता इंटरफ़ेस का वर्णन पूरी तरह से ठोस होने तक भवन निर्माण की प्रक्रिया लगातार होती रहती है (जैसे, पूरी तरह से RenderObjectWidgets, जिसमें कंक्रीट RenderObjects का वर्णन होता है)।

स्टेटलेस विजेट तब उपयोगी होता है जब आप जिस यूजर इंटरफेस का वर्णन कर रहे हैं उसका हिस्सा ऑब्जेक्ट में स्वयं कॉन्फ़िगरेशन जानकारी के अलावा और बिल्डकॉनटेक्स्ट जिसमें विजेट फुलाया जाता है पर निर्भर नहीं करता है। ऐसी रचनाओं के लिए जो गतिशील रूप से बदल सकती हैं, उदाहरण के लिए एक आंतरिक घड़ी चालित राज्य होने के कारण, या कुछ सिस्टम स्थिति के आधार पर, स्टेटफुलविडग का उपयोग करने पर विचार करें।


9

स्टेटलेस विजेट स्थिर विजेट हैं। आपको स्टेटलेस विजेट्स को इनिशियलाइज़ करने से पहले कुछ प्रॉपर्टीज़ को पास करना होगा। वे किसी भी डेटा परिवर्तन या किसी भी व्यवहार परिवर्तन पर निर्भर नहीं करते हैं। उदाहरण के लिए। पाठ, चिह्न, RaisedButton स्टेटलेस विजेट हैं।

स्टेटफुल विजेट डायनेमिक विजेट हैं, इन्हें उपयोगकर्ता की कार्रवाई या डेटा परिवर्तन के आधार पर रनटाइम के दौरान अपडेट किया जा सकता है। यदि कोई विजेट रन टाइम के दौरान अपनी स्थिति बदल सकता है तो यह स्टेटफुल विजेट होगा।

15/11/2018 संपादित करें

यदि इनपुट / एक्सटर्नल डेटा बदल गया है (एक्सटर्नल डेटा जो कंस्ट्रक्टर से गुजरा है) तो स्टेटलेस विड्जेट्स री-रेंडर कर सकता है। क्योंकि स्टेटलेस विजेट्स में कोई स्थिति नहीं होती है, उन्हें एक बार रेंडर किया जाएगा और खुद को अपडेट नहीं किया जाएगा, लेकिन केवल तब अपडेट किया जाएगा जब बाहरी डेटा बदल जाएगा।

जबकि स्टेटफुल विजेट में एक आंतरिक स्थिति होती है और यदि इनपुट डेटा में बदलाव होता है या यदि विजेट की स्थिति बदल जाती है तो उसे फिर से प्रस्तुत किया जा सकता है।

स्टेटलेस और स्टेटफुल दोनों तरह के विजेट में अलग-अलग जीवनचक्र होते हैं।


यहां तक ​​कि एक नया डेटा बाहर से Statelessविजेट में पास करने के बाद भी हम इसे रन टाइम में बदल सकते हैं लेकिन इसे Statefulविजेट (आपकी अंतिम पंक्ति के विपरीत) नहीं कहा जाता है ।
CopsOnRoad

क्या आप कृपया बता सकते हैं कि बाहरी डेटा में परिवर्तन होने पर स्टेटलेस विजेट को कैसे अपडेट किया जा सकता है? (बाहरी डेटा के साथ जो डेटा कंस्ट्रक्टर के माध्यम से पारित किया जाता है ")। क्या कंस्ट्रक्टर को केवल एक बार ही नहीं बुलाया जाएगा? कंस्ट्रक्टर परिवर्तन के माध्यम से डेटा कैसे पारित हुआ?
user1596274

8

मैं एक बहुत ही सरल सादृश्य के बारे में सोच सकता हूं। आपके पास पुस्तकों, सजावट और टीवी के साथ फर्नीचर का कुछ टुकड़ा है। फर्नीचर बेकार है, यह कुछ भी नहीं ले जाता है। टीवी में, दूसरी तरफ, आप इसे चालू कर सकते हैं, बंद कर सकते हैं, चैनल बदल सकते हैं, एक फिल्म खेल सकते हैं यदि इसमें कुछ डीवीडी संलग्न है, आदि। टीवी में एक आंतरिक स्थिति होती है जो इसे व्यवहार करने के तरीके को प्रभावित करती है। फर्नीचर में आपके पास कोई राज्य नहीं है। फर्नीचर में टीवी की उपस्थिति इसके लिए एक राज्य नहीं जोड़ रही है। उम्मीद है की यह मदद करेगा।


यह पूछने वाले के विशिष्ट प्रश्न का उत्तर नहीं देता है।
यशायाह

1
यह एक महान सादृश्य है!
विलियम टेरिल

6

स्टैक ओवरफ्लो प्रश्न का उत्तर - स्टेटलाइज़ेशन बनाम स्टेटलेसनेस

स्पंदन में, अंतर यह है कि स्टेटलेस विगेट्स को अकेले सभी कंस्ट्रक्टर तर्कों द्वारा परिभाषित किया जा सकता है। यदि आप एक ही तर्क का उपयोग करके दो स्टेटलेस विजेट बनाते हैं, तो वे समान होंगे।

एक स्टेटफुल विजेट, हालांकि, जरूरी नहीं कि एक ही कंस्ट्रक्टर तर्कों के साथ बनाया गया हो। यह एक अलग स्थिति में हो सकता है।
वास्तव में, एक स्टेटफुल विजेट अपरिवर्तनीय (स्टेटलेस) होता है, लेकिन फ़्लटर एक अलग स्टेट ऑब्जेक्ट का प्रबंधन करता है और विजेट के साथ स्टेटफुलगेट डॉक में बताया गया है । इसका मतलब यह है कि जब फ़्लटर एक स्टेटफुल विजेट को फिर से बनाता है, तो यह देखने के लिए जांच करेगा कि क्या उसे पिछली राज्य ऑब्जेक्ट का पुन: उपयोग करना चाहिए और यदि वांछित हो, तो उस स्टेट ऑब्जेक्ट को विजेट में संलग्न करें।

अभिभावक विजेट स्टेटलेस है क्योंकि उसे अपने बच्चे की स्थिति की परवाह नहीं है। खुद राज्य के बच्चे (या तकनीकी रूप से स्पंदन) अपने राज्य की देखभाल करेंगे।
उच्च स्तर पर, मैं मानता हूं कि यह अभिभावक विजेट को स्टेटफुल बनाता है, क्योंकि दो माता-पिता अलग-अलग राज्यों के साथ दो बच्चे हो सकते हैं और इस प्रकार तकनीकी रूप से खुद अलग हो सकते हैं। लेकिन स्पंदन के दृष्टिकोण से, यह राज्य के बारे में परवाह किए बिना माता-पिता विजेट का निर्माण करता है और केवल जब बच्चे का निर्माण होता है, तो इसकी स्पष्टता पर विचार करेगा।


5

स्टेटफुल और स्टेटलेस विजेट्स क्या हैं?

TL; DR: एक विजेट जो आपको स्क्रीन को रिफ्रेश करने की अनुमति देता है वह एक स्टेटफुल विजेट है। एक विजेट जो स्टेटलेस नहीं है।

अधिक विस्तार से, सामग्री के साथ एक गतिशील विजेट जो बदल सकता है एक स्टेटफुल विजेट होना चाहिए। एक स्टेटलेस विजेट केवल सामग्री को बदल सकता है जब मापदंडों को बदल दिया जाता है और इसलिए विजेट पदानुक्रम में इसके स्थान के बिंदु से ऊपर की आवश्यकता होती है। स्थिर सामग्री वाली स्क्रीन या विजेट एक स्टेटलेस विजेट होना चाहिए लेकिन सामग्री को बदलने के लिए, स्टेटफुल होने की आवश्यकता है।

मुझे दिलचस्प सापेक्ष कहानी पर यह सापेक्ष सामग्री मिली। आपका स्वागत है!


4

स्टेटलेस : विजेट राज्य केवल ONCE बनाता है, फिर यह मूल्यों को अपडेट कर सकता है लेकिन स्पष्ट रूप से नहीं । यह वहां की संरचना से भी स्पष्ट है। इसलिए इसका केवल एक वर्ग है जो इसके साथ विस्तार करता है StatelessWidget। इसलिए अगर मैं कहूं, तो वे फिर से build()विधि को फिर से नहीं चला सकते ।

स्टेटफुल : विजेट ट्रिगर होने पर कई बार (स्थानीय रूप से) और मानों को अपडेट कर सकते हैं । यही कारण है, कार्यान्वयन भी अलग है। इसमें, हमारे पास 2 वर्ग हैं, एक है StatefulWidgetऔर दूसरा वह है राज्य कार्यान्वयन हैंडलर यानी State<YourWidget>। इसलिए अगर मैं कहता हूं, तो वे build()ट्रिगर किए गए घटनाओं के आधार पर विधि को फिर से चला सकते हैं ।

नीचे आरेख मदद करेगा।

यहाँ छवि विवरण दर्ज करें


1

ऐप लिखते समय, आप आमतौर पर नए विजेट्स को लेखक करेंगे जो स्टेटलेसविडगेट या स्टेटफुलविजेट के उपवर्ग हैं

यहाँ कुछ अंतर के बीच StatelessWidgetऔर StatefulWidgetविजेट हैं:

स्टेटलेस विजेट:

  1. एक विजेट जिसमें एक अपरिवर्तनीय स्थिति होती है।
  2. स्टेटलेस विजेट स्थिर विजेट हैं।
  3. वे किसी भी डेटा परिवर्तन या किसी भी व्यवहार परिवर्तन पर निर्भर नहीं करते हैं।
  4. स्टेटलेस विजेट्स में कोई स्थिति नहीं होती है, उन्हें एक बार रेंडर किया जाएगा और खुद को अपडेट नहीं किया जाएगा, लेकिन केवल तब अपडेट किया जाएगा जब बाहरी डेटा बदल जाएगा।
  5. उदाहरण के लिए: Text, Icon, RaisedButtonस्टेटलेस विजेट है।

स्टेटलेस विजेट:

  1. एक विजेट जिसमें एक परिवर्तनशील स्थिति होती है।
  2. स्टेटफुल विजेट गतिशील विजेट हैं।
  3. उपयोगकर्ता कार्रवाई या डेटा परिवर्तन के आधार पर उन्हें रनटाइम के दौरान अपडेट किया जा सकता है।
  4. स्टेटफुल विजेट में एक आंतरिक स्थिति होती है और यदि इनपुट डेटा में बदलाव होता है या यदि विजेट की स्थिति बदलती है तो फिर से प्रस्तुत कर सकते हैं।
  5. उदाहरण के लिए: Checkbox, Radio Button, Sliderस्टेटफुल विजेट हैं

0

सरल शब्दों में:

जैसा कि हम जानते हैं कि हर विजेट स्पंदन में एक दृश्य है। जिसकी अपनी कक्षाएं हैं। जब हम उन वर्गों का उपयोग करते हैं तो हम इसका एक उद्देश्य बनाते हैं। हम उनके भिन्न चरों / गुणों को मान देते हैं। पूर्व। हम टेक्स्ट विजेट बना रहे हैं ताकि हम इसे स्ट्रिंग, रंग, फ़ॉन्ट आकार, फ़ॉन्ट परिवार दे सकें। इसलिए इसे देते हुए, हम इसे बनाते समय इसके गुणों को परिभाषित कर रहे हैं। इस बिंदु तक, स्टेटलेस या स्टेटफुल विजेट समान हैं, लेकिन

जब हम इसके गुणों को बदलना / अपडेट करना चाहते हैं (चलो स्ट्रिंग या रंग कहते हैं) फिर से और फिर बाद में यह स्टेटफुल विजेट होना चाहिए।

और जब हम पहली बार इसे स्टैटिनलेस विजेट परिभाषित करने के बाद इसके गुणों को बदलना नहीं चाहते हैं।

इसका मतलब है कि हम उस डेटा की परवाह करते हैं जो विजेट होल्ड / कंट्रोल / शो करता है।

तो स्टेटलेस डेटा कम है और स्टेटफुल डेटा पूर्ण है।

अब यदि आप एक ऐसे वर्ग को परिभाषित करते हैं जो कि स्टेटलेस है, जिसका अर्थ है कि यह वर्ग इसकी परवाह नहीं करता है / इसमें चर नहीं है या अपनी ही कक्षा अर्थात कक्षा स्तर में डेटा कहता है, लेकिन इसमें एक और विजेट / वर्ग हो सकता है जो डेटा की परवाह करता है अर्थात यह स्टेटफुल है । इसलिए इसका एक-दूसरे पर कोई प्रभाव नहीं पड़ता है।

अगर मैं यहां गलत हूं तो कृपया मुझे सुधारें।


0

स्टेटफुल और स्टेटलेस विजेट्स क्या हैं?

स्टेटलेस विजेट: स्टेटलेस विजेट तभी बनता है, जब वह माता-पिता के बदलाव का हो।

स्टेटफुल विजेट्स: स्टेट फुल विगेट्स स्टेट्स ऑफ विजेट है और स्टेट्स चेंज होने पर इसका पुनर्निर्माण किया जा सकता है।


0

अस्वीकरण: - पिछले सप्ताह से स्पंदन पर काम करना शुरू किया :)

स्टेटलेस और स्टेटफुल विजेट का UI बनाने और अपडेट करने के लिए उसका अपना जीवनचक्र है। हालाँकि आप UI रेंडर करने के लिए या तो स्टेटलेस या स्टेटफुल का उपयोग कर सकते हैं, लेकिन व्यावहारिक रूप से स्टेटफुल तब अधिक काम आता है जब यूआई पूरी तरह से या आंशिक रूप से बाहरी डेटा के साथ निर्भर होता है (जैसे - एपीआई का उपयोग करके एक सूची प्रदान करना) जबकि स्टेटिक विजेट का उपयोग करके स्टैटिक यूई को किसी भी स्क्रीन पर रेंडर किया जाता है। एक अच्छा अभ्यास।


1
मुझे लगता है कि लेखक का मतलब इसके विपरीत था: · डी
रोको बोरनाट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.