स्टेटफुलविडेट बनाम स्टेटलेसविजेट।
स्टेटलेसविजेट - एक विजेट जिसे परस्पर अवस्था की आवश्यकता नहीं होती है।
एक स्टेटलेस विजेट एक विजेट है जो उपयोगकर्ता इंटरफ़ेस के एक तारामंडल का निर्माण करके अन्य इंटरफेस का वर्णन करता है जो उपयोगकर्ता इंटरफ़ेस का अधिक संक्षिप्त वर्णन करता है। उपयोगकर्ता इंटरफ़ेस का वर्णन पूरी तरह से ठोस होने तक भवन निर्माण की प्रक्रिया लगातार होती रहती है (जैसे, पूरी तरह से 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 जीवनचक्र
जीवनचक्र में निम्नलिखित सरलीकृत चरण हैं:
- createState () - जब Flutter को StatefulWidget बनाने का निर्देश दिया जाता है, तो वह तुरंत कॉल करता है
createState()
।
@override
_MyState createState() => _MyState();
- आरोहित == सत्य - सभी विगेट्स के पास एक बूल
this.mounted
प्रॉपर्टी है। buildContext
असाइन किए जाने पर यह सही हो जाता है । setState
विजेट अनमाउंट होने पर कॉल करना एक त्रुटि है । क्या यह राज्य वस्तु वर्तमान में एक पेड़ में है।
स्टेट ऑब्जेक्ट बनाने और कॉल करने से पहले initState
, फ्रेमवर्क स्टेट ऑब्जेक्ट को "a" से जोड़कर "mounts" करता है
BuildContext
। जब तक फ्रेमवर्क
कॉल नहीं करता dispose()
, तब तक राज्य ऑब्जेक्ट माउंटेड रहता है , जिसके बाद फ्रेमवर्क
स्टेट ऑब्जेक्ट को फिर से बनाने के लिए नहीं कहेगा ।
जब तक घुड़सवार सही न हो, तब तक सेटस्टेट को कॉल करना एक त्रुटि है।
bool get mounted => _element != null;
- initState () - यह पहला तरीका है जिसे विजेट बनाया जाता है (क्लास कंस्ट्रक्टर के बाद, निश्चित रूप से)।
initState
एक बार और केवल एक बार कहा जाता है। इसे कॉल करना होगाsuper.initState().
विजेट के बनाए गए उदाहरण के लिए विशिष्ट BuildContext पर निर्भर डेटा को प्रारंभ करें।
पेड़ पर इन विगेट्स 'माता-पिता' पर भरोसा करने वाले गुणों को प्रारंभिक करें।
स्ट्रीम, ChangeNotifiers
या किसी भी अन्य ऑब्जेक्ट की सदस्यता लें जो इस विजेट पर डेटा को बदल सकती है।
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeDependencies () - जब इस राज्य ऑब्जेक्ट की निर्भरता में परिवर्तन होता है, तो कॉल किया जाता है।
इस विधि को तुरंत बाद भी कहा जाता है initState
। BuildContext.inheritFromWidgetOfExactType
इस विधि से कॉल करना सुरक्षित है ।
उप-वर्ग शायद ही कभी इस पद्धति को ओवरराइड करते हैं क्योंकि ढांचा हमेशा निर्भरता में बदलाव के बाद निर्मित होता है। कुछ उपवर्ग इस पद्धति को ओवरराइड करते हैं, क्योंकि जब वे अपनी निर्भरता बदलते हैं तो उन्हें कुछ महंगे काम करने होते हैं (जैसे, नेटवर्क लाने के लिए), और यह काम हर बिल्ड के लिए करना बहुत महंगा होगा।
@protected
@mustCallSuper
void didChangeDependencies() { }
- build () - विजेट द्वारा दर्शाए गए यूजर इंटरफेस के हिस्से का वर्णन करता है।
फ्रेमवर्क इस विधि को विभिन्न स्थितियों में कहता है:
- कॉल करने के बाद
initState
।
- कॉल करने के बाद
didUpdateWidget
।
- करने के लिए एक कॉल प्राप्त करने के बाद
setState
।
- इस राज्य वस्तु परिवर्तनों की निर्भरता के बाद (जैसे, पिछले निर्माण परिवर्तनों द्वारा संदर्भित InheritedWidget)।
- कॉल निष्क्रिय करने के बाद और फिर किसी अन्य स्थान पर पेड़ में राज्य वस्तु को फिर से स्थापित करना।
इस विधि द्वारा दिए गए विजेट के साथ, फ्रेमवर्क इस विजेट के नीचे के सबट्री को बदल देता है, या तो मौजूदा सबट्री को अपडेट करके या सबट्री को हटाकर और एक नई सबट्री को फुलाकर, इस पद्धति से लौटाए गए विजेट के आधार पर मौजूदा सबट्री के रूट को अपडेट कर सकता है या नहीं , जैसा कि फोन करके निर्धारित किया जाता है
Widget.canUpdate
।
आमतौर पर कार्यान्वयन विगेट्स के एक नए बनाए गए तारामंडल को लौटाते हैं जो इस विजेट के निर्माता, दिए गए बिल्डकनेक्ट , और इस राज्य ऑब्जेक्ट की आंतरिक स्थिति से जानकारी के साथ कॉन्फ़िगर किए गए हैं ।
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget () - जब भी विजेट कॉन्फ़िगरेशन बदलता है, तब कॉल किया जाता है।
यदि पैरेंट विजेट पुनर्निर्मित करता है और अनुरोध करता है कि ट्री में यह स्थान उसी रनटाइम प्रकार और विजेट .key के साथ एक नया विजेट प्रदर्शित करने के लिए अपडेट करता है, तो फ्रेमवर्क इस स्टेट ऑब्जेक्ट की विजेट प्रॉपर्टी को नए विजेट को संदर्भित करने के लिए अपडेट करेगा और फिर इसे कॉल करेगा। एक तर्क के रूप में पिछले विजेट के साथ विधि।
जब विजेट बदलता है (उदाहरण के लिए अंतर्निहित एनिमेशन शुरू करने के लिए) प्रतिक्रिया देने के लिए इस विधि को ओवरराइड करें।
हमेशा किए गए कॉल के बाद फ्रेमवर्क कॉल किया जाता है, जिसका अर्थ है कि डुपडेटटेड में सेटस्टैट करने के लिए कोई भी कॉल निरर्थक है।
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- setState () - जब भी आप किसी स्टेट ऑब्जेक्ट की आंतरिक स्थिति को बदलते हैं, तो उस फ़ंक्शन में बदलाव करें जिसे आप पास करते हैं
setState
:
कॉलिंग सेटस्टैट उस रूपरेखा को सूचित करता है कि इस वस्तु की आंतरिक स्थिति इस तरह से बदल गई है जो इस उपप्रकार में उपयोगकर्ता इंटरफ़ेस को प्रभावित कर सकती है, जो
इस राज्य वस्तु के लिए रूपरेखा का निर्माण करने का कारण बनता है ।
यदि आप सेटस्टैट को कॉल किए बिना सीधे राज्य को बदलते हैं , तो फ्रेमवर्क एक बिल्ड शेड्यूल नहीं कर सकता है और इस सबट्री के लिए यूजर इंटरफेस नए राज्य को प्रतिबिंबित करने के लिए अपडेट नहीं किया जा सकता है।
setState(() { _myState = newValue });
- निष्क्रिय () - निष्क्रियता उस स्थिति को कहा जाता है जब राज्य को पेड़ से हटा दिया जाता है, लेकिन वर्तमान फ्रेम परिवर्तन समाप्त होने से पहले इसे फिर से स्थापित किया जा सकता है। यह विधि मूल रूप से मौजूद है क्योंकि राज्य वस्तुओं को एक पेड़ से दूसरे बिंदु पर स्थानांतरित किया जा सकता है।
- जब भी वह इस स्टेट ऑब्जेक्ट को ट्री से हटाता है, तो फ्रेमवर्क इस विधि को कॉल करता है। कुछ मामलों में, फ्रेमवर्क स्टेट ऑब्जेक्ट को ट्री के दूसरे हिस्से में फिर से इंस्टॉल करेगा (जैसे, अगर इस स्टेट ऑब्जेक्ट वाली सबट्री को ट्री के एक स्थान से दूसरे में ग्राफ्ट किया जाता है)। यदि ऐसा होता है, तो रूपरेखा यह सुनिश्चित करेगी कि यह राज्य में वस्तु को पेड़ में अपने नए स्थान के अनुकूल होने का मौका देने के लिए निर्माण का आह्वान करे। यदि फ्रेमवर्क इस सबट्री को फिर से स्थापित करता है, तो यह एनीमेशन फ्रेम के अंत से पहले ऐसा करेगा जिसमें सबट्री को पेड़ से हटा दिया गया था। इस कारण से, राज्य वस्तुएं अधिकांश संसाधनों को जारी करने से रोक सकती हैं जब तक कि फ्रेम उनके निपटान के तरीके को नहीं बुलाता है।
यह शायद ही कभी इस्तेमाल किया जाता है।
@protected
@mustCallSuper
void deactivate() { }
- dispose () - इस ऑब्जेक्ट को स्थायी रूप से पेड़ से हटाए जाने पर कॉल किया जाता है।
जब यह राज्य ऑब्जेक्ट फिर से कभी नहीं बनेगा, तो फ्रेमवर्क इस विधि को कॉल करता है। फ्रेमवर्क कॉल के बाद dispose()
, स्टेट ऑब्जेक्ट को अनमाउंट माना जाता है और माउंटेड संपत्ति झूठी है। इस बिंदु पर सेटस्टेट को कॉल करना एक त्रुटि है। जीवनचक्र का यह चरण टर्मिनल है: किसी राज्य वस्तु को हटाने का कोई तरीका नहीं है जिसका निपटान किया गया है।
उपवर्गों को इस ऑब्जेक्ट द्वारा बनाए गए किसी भी संसाधन को जारी करने के लिए इस विधि को ओवरराइड करना चाहिए (जैसे, किसी भी सक्रिय एनिमेशन को रोकना)।
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
अधिक जानकारी के लिए जाना यहाँ यहाँ , यहाँ