এটা তোলে জন্য ব্যাপার mixinগুলি (এবং যে কারণে তোমার জন্য পাশাপাশি)
এ-তে লাইফাইসাইক্যাল পদ্ধতিগুলি ওভাররাইড করার সময় সুপার পদ্ধতিটি কল করা এটি ঝাঁকুনির কাঠামোর একটি দৃষ্টান্তState । এ কারণেই এমনকি deactivateএকটি mustCallSuperটীকাও রয়েছে ।
অধিকন্তু , কিছু লোক mixinআশা করে যে আপনি সেই লাইফাইকাইকেল পদ্ধতিগুলির সুপার পদ্ধতিগুলিকে ফাংশনের একটি নির্দিষ্ট সময়ে কল করবেন।
এর অর্থ আপনি ডকুমেন্টেশন এবং কল অনুসরণ করা উচিত super.dispose শেষে আপনার এর disposeপদ্ধতি কারণ mixinউপর গুলি Stateকাঠামোর মধ্যে আশা যে এই ক্ষেত্রে দেখা যায়।
উদাহরণস্বরূপ: TickerProviderStateMixinএবং শেষে জোর দিন :SingleTickerProviderStateMixin super.dispose
সুপার.ডিসপোজ () কল করার আগে সমস্ত টিকিটকে অবশ্যই নিষ্পত্তি করতে হবে [..]।
আর একটি উদাহরণ: AutomaticKeepAliveMixinলজিক ইন initStateএবং কার্যকর করে dispose।
উপসংহার
আপনার initStateসাথে শুরু করুনsuper.initState এবং আপনার disposeসাথেsuper.dispose সহজ এবং নিরাপদ দিকে থাকতে চাইলে আপনার সাথে শেষmixin করুন State।
তদ্ব্যতীত, অন্যান্য আজীবন পদ্ধতিগুলির জন্য ডকুমেন্টেশনগুলি অনুসরণ করুন (যে পদ্ধতি আপনি ওভাররাইট করেছেন তাতে State) কারণ কাঠামোটি আশা করবে যে আপনি ডকুমেন্টেশনে বর্ণিত হিসাবে সুপার পদ্ধতিগুলি কল করবেন।
সুতরাং, নিম্নলিখিতটি আপনার করা উচিত:
void initState() {
super.initState();
//DO OTHER STUFF
}
যাইহোক, এটি সত্যিকার অর্থে কোনও বিষয় নয় State, যা আমি নিম্নলিখিত এবং এমনকি মিক্সিনগুলির জন্য ব্যাখ্যা করব, এটি কেবলমাত্র আমি যা খুঁজে পেতে পারি তার থেকে বিচার করার জন্য গুরুত্বপূর্ণ - তবে এটি আপনার প্রোডাকশন অ্যাপটিকে প্রভাবিত করবে না।
এটা কোন ব্যাপার না State
আমি মনে করি যে থেকে আগের দুটি উত্তর পাবলো Barrera এবং CopsOnRoad হয় বিভ্রান্তিকর কারণ বিষয়টি সত্য যে এটা সত্যিই কোন ব্যাপার না এবং আপনি পর্যন্ত সন্ধান করতে হবে না।
শুধুমাত্র যে সমস্ত কর্ম super.initStateএবং super.disposeগ্রহণ Stateবর্গ নিজেই হয় গবেষকেরা এবং যেহেতু assert-statements শুধুমাত্র বিশেষভাবে মূল্যায়ন করা হয় ডিবাগ মোড , তাই না ব্যাপার সব একবার বিল্ড আপনার অ্যাপ এ, অর্থাত প্রকাশনা মোডে আছে।
নিম্নলিখিত, আমি কি আপনি মাধ্যমে পথ প্রদর্শন করবে super.initStateএবং super.disposeনা Stateযা সব কোডটি মৃত্যুদন্ড কার্যকর করা হবে কোন অতিরিক্ত mixins আছে হয়।
initState
আসুন আমরা super.initStateপ্রথমে ( উত্স ) কোডটি কার্যকর করা হয় তা দেখতে দিন :
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
আপনি দেখতে পাচ্ছেন, কেবলমাত্র একটি লাইফসাইकल দৃ as়তা রয়েছে এবং এটির উদ্দেশ্যটি আপনার উইজেটটি সঠিকভাবে কাজ করে তা নিশ্চিত করা। সুতরাং যতক্ষণ আপনি নিজের super.initState জায়গায় অন্য কোথাও কল initStateকরবেন, AssertionErrorআপনার উইজেট যদি ইচ্ছা অনুযায়ী কাজ না করে তবে আপনি দেখতে পাবেন । আপনি কিছু প্রাক্কলিত পদক্ষেপ নিয়েছেন কিনা তা বিবেচ্য নয় কারণ assertকেবলমাত্র আপনার কোডের কিছু যে কোনওভাবেই ভুল বলে প্রতিবেদন করার জন্য এটি বোঝানো হয়েছে এবং আপনি যদি দেখেন যে আপনি super.initStateআপনার পদ্ধতির একেবারে শেষে কল করেছেন এমনকি if
dispose
disposeপদ্ধতি অনুরূপ (হয় উৎস ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
আপনি দেখতে পাচ্ছেন, এটিতে কেবলমাত্র এমন দাবি রয়েছে যা ডিবাগ লাইফাইসাইকেল চেকিং পরিচালনা করে। দ্বিতীয়টি assertএখানে একটি দুর্দান্ত কৌশল কারণ এটি নিশ্চিত করে যে এটি _debugLifecycleStateকেবলমাত্র ডিবাগ মোডে পরিবর্তিত হয়েছে (যেমন- assertস্ট্যাটমেন্টগুলি কেবলমাত্র ডিবাগ মোডে কার্যকর করা হয়)।
এর অর্থ হ'ল যতক্ষণ আপনি নিজের পদ্ধতিতে super.dispose কোথাও কল করবেন ততক্ষণ আপনি অতিরিক্ত কার্যকারিতা যুক্ত না করে মিক্সিন ছাড়া কোনও মান হারাবেন না।