আমি কি শেষে শুরুতে সুপার.ইনটিস্টেট কল করব?


10

আমি কনফিউজড হয়েছি super.initSate()এলোমেলো ফোন করতে কোথায় ? কিছু কোড উদাহরণে এটি শুরুতে এবং অন্যদের শেষে বলা হয়। পার্থক্য আছে কি?

আমি এটি গুগল করার চেষ্টা করেছি কিন্তু এই ফাংশন কলের অবস্থান সম্পর্কে কোনও ব্যাখ্যা পাইনি।

কোনটি সঠিক?

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

অথবা

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

উত্তর:


4

এটা তোলে জন্য ব্যাপার 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 কোথাও কল করবেন ততক্ষণ আপনি অতিরিক্ত কার্যকারিতা যুক্ত না করে মিক্সিন ছাড়া কোনও মান হারাবেন না।


1
গোলমাল অফিসিয়াল ডক্স খুব ভাল নয় :( আপনার উত্তরের জন্য ধন্যবাদ :)
CopsOnRoad

আপনার ব্যাখ্যার জন্য ধন্যবাদ, আপনি কি ব্যাখ্যা করতে মন চান, initState()পদ্ধতিতে কেবল একটি লাইন আছে assert(...), তাই এমনকি super.initState()প্রোডাকশন অ্যাপে কল করার সুবিধা কী ?
কক্সঅনরোড

1
অনেক ধন্যবাদ. এখন তা বোঝা যায়! সুতরাং আমি অনুমান করি যে নিরাপদ দিকে এবং ভাল প্রোগ্রামিং অনুশীলনের জন্য কোডের শুরুতে এটি রাখা ভাল।
কে বিজ

@ ক্রিয়েটিভ ক্রিয়েটোরমায়াবেনোট এর অর্থ ফ্লুটারের mustCallSuperঅস্তিত্ব আসার পর থেকে এখন 2 বছরেরও বেশি সময় ধরে এই পদ্ধতিটি রেখে ফ্লার্ট দল তাদের মন থেকে বাইরে চলেছে। স্যার সেখানে রেখে লাভ কী?
কক্সঅনরোড

@ ক্রিয়েটিভ ক্রিয়েটোরোমায়াবেনট এমনকি দলটি এটি তৈরি mixinকরলেও, এখনও এর মধ্যে একটি বিবৃতি হতে পারে initStateযা একটি প্রযোজনা অ্যাপের জন্য assert(...)কল করার তাৎপর্যটি কী super.initState()?
15:39

3

super.initState()আপনার initStateপদ্ধতির সর্বদা প্রথম লাইন হওয়া উচিত ।

ডক্স থেকে:

initState (): আপনি যদি ওভাররাইড করে থাকেন তবে নিশ্চিত হয়ে নিন যে আপনার পদ্ধতিটি সুপার.inititate () এ কল দিয়ে শুরু হয়েছে।


2

ফ্রেমওয়ার্ক থেকে আপনি ক্লাসে দেখতে পাচ্ছেন, উইজেট শুরু হওয়ার পরে আপনার অর্থ সবকিছু করা উচিত super.initState()

আমার নিষ্পত্তি হওয়ার বিষয়টি অন্যভাবে যুক্তিযুক্তভাবে হবে, প্রথমে সমস্ত কিছু করুন এবং তারপরে কল করুন super.dispose()

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

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

ধন্যবাদ. তবে আমি লক্ষ্য করেছি যে কিছু কোড উদাহরণে। এটিকে স্ট্রিট পদ্ধতিটির শেষে বলা হয় ...
কে বিজ

আমি যা বলেছিলাম
পাবলো ব্যেরেরা

0

যখনই নতুন উইজেট ট্রিতে নতুন স্টেটফুল উইজেট যুক্ত হয় তখন ডিফল্টরূপে ডাকা হয় ইনস্টেট। এখন সুপার ইন্ডিআইটিস্টেট আপনার উইজেটের বেস ক্লাসের ডিফল্ট বাস্তবায়ন সম্পাদন করে super আপনি সুপার.initState এর আগে যদি এমন কোনও কিছু কল করেন যা বেস ক্লাসের উপর নির্ভর করে তবে এটি সমস্যার কারণ হতে পারে। এজন্যই আপনাকে এই ফ্যাশনে আরটিস্টেট কল করার পরামর্শ দেওয়া হচ্ছে:

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

যুক্তিটি কিছুটা ত্রুটিযুক্ত কারণ disposeএটির বিপরীত। ফ্রেমওয়ার্কটি আপনাকে super.dispose শেষে কল করার প্রত্যাশা করে , তবে প্রস্তাবনাটি সঠিক।
ক্রিয়েটিভ ক্রিয়েটোরমায়াবেনট

কারণ আপনি যদি অন্য বিষয়গুলি নিষ্পত্তি করার আগে সুপার.ডিসপোজ কল করেন তবে আপনার বেস শ্রেণীর উপর নির্ভরশীল উপাদানগুলি সংঘর্ষে লিপ্ত হতে পারে।
অনিরুদ্ধ শর্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.