यह mixins के लिए मायने रखता है (और उसके कारण आपके लिए भी)
सुपरचक्र पद्धति को कॉल करने के लिए फ़्लटर ढांचे में यह एक प्रतिमान है जब जीवनचक्र के तरीकों को ओवरराइडिंग ए State। यही कारण है कि deactivateएक mustCallSuperएनोटेशन भी है ।
इसके अतिरिक्त , कुछ लोग mixinअपेक्षा करते हैं कि आप फ़ंक्शन में किसी विशेष बिंदु पर उन जीवनचक्र विधियों के सुपर तरीकों को कॉल करें।
इसका मतलब है कि आप दस्तावेज और कॉल का पालन करना चाहिए super.dispose अंत में अपने की disposeविधि क्योंकि mixinपर रों Stateढांचे में उम्मीद करते हैं कि यह मामला है।
उदाहरण के लिए: TickerProviderStateMixinऔर अंत में मुखर :SingleTickerProviderStateMixin super.dispose
सभी टीकरों को सुपर .ispose () कॉल करने से पहले निपटाया जाना चाहिए।
एक और उदाहरण: AutomaticKeepAliveMixinमें तर्क निष्पादित करता है initStateऔर dispose।
निष्कर्ष
अपने शुरू initStateके साथsuper.initState और अंत अपने disposeसाथsuper.dispose यदि आप जोड़ने आसान और सुरक्षित पक्ष पर होना चाहते हैं mixinअपने को रों State।
इसके अलावा, अन्य जीवनचक्र विधियों (किसी भी विधि को आप अधिलेखित करें State) के लिए प्रलेखन का पालन करें क्योंकि फ्रेमवर्क यह अपेक्षा करेगा कि आप प्रलेखन में वर्णित सुपर तरीकों को कॉल करें।
इस प्रकार, निम्नलिखित आपको क्या करना चाहिए:
void initState() {
super.initState();
//DO OTHER STUFF
}
हालांकि, यह वास्तव में मायने नहीं रखता है State, जिसे मैं निम्नलिखित में और यहां तक कि मिक्सिन्स के लिए भी समझाऊंगा, यह केवल उन चीजों को देखते हुए मायने रखता है जो मुझे मिल सकता है - इसलिए यह आपके उत्पादन ऐप को प्रभावित नहीं करेगा।
इसके लिए कोई फर्क नहीं पड़ता State
मुझे लगता है कि पिछले दो जवाब पाब्लो बरेरा और CopsOnRoad कर रहे हैं गुमराह क्योंकि इस मामले की सच्चाई यह है कि यह वास्तव में कोई फर्क नहीं पड़ता और आप अब तक देखने की जरूरत नहीं है।
केवल कक्षा में ही होने वाली क्रियाएँ super.initStateऔर दावे हैं क्योंकि -statements का केवल डिबग मोड में मूल्यांकन किया जाता है , यह आपके ऐप के निर्माण के समय यानी उत्पादन मोड में बिल्कुल भी मायने नहीं रखता है।super.disposeStateassert
निम्नलिखित में, मैं आपको क्या super.initStateऔर क्या super.disposeकरना है State, के माध्यम से मार्गदर्शन करेगा , जो कि सभी कोड हैं जिन्हें तब निष्पादित किया जाएगा जब आपके पास कोई अतिरिक्त मिश्रण नहीं होगा।
initState
आइए देखें कि super.initStateपहले ( स्रोत ) में किस कोड को निष्पादित किया गया है :
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
जैसा कि आप देख सकते हैं, केवल एक जीवन चक्र है और इसका उद्देश्य यह सुनिश्चित करना है कि आपका विजेट सही तरीके से काम करे। तो जब तक आप अपने आप में super.initState कहीं कॉल करते हैं initState, तब तक आप देखेंगे AssertionErrorकि आपका विजेट उद्देश्य के अनुसार काम नहीं कर रहा है। इससे कोई फर्क नहीं पड़ता कि आपने कुछ पूर्व कार्रवाई की है क्योंकि assertकेवल रिपोर्ट करने के लिए है कि आपके कोड में कुछ भी गलत है और आप देखेंगे कि भले ही आप super.initStateअपने तरीके के अंत में कॉल करें ।
dispose
disposeविधि अनुरूप (है स्रोत ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
जैसा कि आप देख सकते हैं, इसमें केवल डीबग जीवनचक्र की जाँच करने वाले निबंध शामिल हैं । यहाँ दूसरी assertएक अच्छी चाल है क्योंकि यह सुनिश्चित करती है कि इसे _debugLifecycleStateकेवल डिबग मोड में बदल दिया जाए (क्योंकि assert-स्टेटमेंट केवल डीबग मोड में निष्पादित होते हैं)।
इसका मतलब है कि जब तक आप अपनी खुद की विधि में super.dispose कहीं भी कॉल करते हैं, तब तक आप अतिरिक्त कार्यक्षमता जोड़े बिना मिक्सिन के किसी भी मूल्य को नहीं खोएंगे।