क्या मुझे अंत में या शुरुआत में super.initState को कॉल करना चाहिए?


12

मैं असमंजस में हूँ कि super.initSate()फड़फड़ाहट में कहाँ बुलाऊँ? कुछ कोड उदाहरणों में इसे शुरुआत में और दूसरे में अंत में बुलाया जाता है। क्या कोई अंतर है?

मैंने इसे Google करने की कोशिश की है, लेकिन इस फ़ंक्शन कॉल की स्थिति पर कोई स्पष्टीकरण नहीं मिला है।

कौनसा सही है?

void initState() {
  super.initState();    
  //DO OTHER STUFF
}

या

void initState() {    
  //DO OTHER STUFF
  super.initState();    
}

जवाबों:


6

यह 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 कहीं भी कॉल करते हैं, तब तक आप अतिरिक्त कार्यक्षमता जोड़े बिना मिक्सिन के किसी भी मूल्य को नहीं खोएंगे।


1
स्पंदन आधिकारिक डॉक्स बहुत अच्छे नहीं हैं :( आपके उत्तर के लिए धन्यवाद :)
CopsOnRoad

आपके स्पष्टीकरण के लिए धन्यवाद, क्या आप भी समझाना पसंद करेंगे, initState()विधि में सिर्फ एक पंक्ति है जो है assert(...), इसलिए super.initState()उत्पादन ऐप में भी कॉल करने का क्या लाभ है ?
CopsOnRoad

1
बहुत धन्यवाद। अब समझ में आता है! इसलिए मुझे लगता है कि यह सुरक्षित पक्ष में है और अच्छे प्रोग्रामिंग अभ्यास के लिए इसे कोड की शुरुआत में रखना अच्छा है।
के विज

@creativecreatorormaybenot अर्थात फ्लटर टीम के mustCallSuperअस्तित्व में आने के बाद 2 साल से अधिक समय से उस पद्धति में डालकर उनके दिमाग से बाहर है। इसे वहां लगाने का क्या फायदा है साहब?
CopsOnRoad

@creativecreatorormaybenot भले ही टीम ने इसके लिए बनाई हो mixin, फिर भी इसमें एक ही बयान दिया जा रहा initStateहै assert(...), इसलिए super.initState()उत्पादन ऐप के लिए कॉल करने का क्या महत्व है ?
CopsOnRoad

3

super.initState()हमेशा आपकी initStateविधि में पहली पंक्ति होनी चाहिए ।

डॉक्स से:

initState (): यदि आप इसे ओवरराइड करते हैं, तो सुनिश्चित करें कि आपका तरीका super.initState () को कॉल करने से शुरू होता है।


2

जैसा कि आप फ्रेमवर्क से कक्षाओं में देख सकते हैं, आपको विजेट प्रारंभिक होने के बाद सब कुछ करना चाहिए, जिसका अर्थ है super.initState()

मैं निपटाने का मामला तार्किक रूप से दूसरे तरीके से होगा, पहले सब कुछ करें और फिर कॉल करें super.dispose()

@override
void initState() {
  super.initState();
  // DO STUFF
}

@override
void dispose() {
  // DO STUFF
  super.dispose();
}

धन्यवाद। लेकिन मैंने देखा है कि कुछ कोड उदाहरणों में। इसे initState पद्धति के अंत में कहा जाता है ...
K Vij

यही मैंने कहा
पाब्लो बर्रे

0

जब भी कोई नया स्टेटफुल विजेट विजेट ट्री में जोड़ा जाता है, तो डिफ़ॉल्ट रूप से initState को कॉल किया जाता है। अब super.initState आपके विजेट के आधार वर्ग के डिफ़ॉल्ट कार्यान्वयन को पूरा करता है। यदि आप super.initState से पहले कुछ भी कॉल करते हैं जो आधार वर्ग पर निर्भर करता है तो यह समस्या का कारण हो सकता है। इसलिए यह अनुशंसा की जाती है कि आप इस तरह से initState को कॉल करें:

@override
void initState() {
  super.initState();
  // DO STUFF
}

तर्क थोड़ा त्रुटिपूर्ण है क्योंकि disposeइसके विपरीत है। फ्रेमवर्क आपको super.dispose अंत में कॉल करने की उम्मीद करता है , लेकिन सिफारिश सही है।
क्रिएटिव

क्योंकि यदि आप अन्य चीजों को निपटाने से पहले सुपर.डिजाइन कहते हैं तो आपके बेस क्लास पर निर्भर घटक क्लैश हो सकते हैं।
अनिरुद्ध शर्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.