টিএল; ডিআর
ভিতরে ভারী গণনার ব্যবহার করবেন না updateShouldNotify পদ্ধতি এবং ব্যবহারের const পরিবর্তে নতুন একটি উইজেট তৈরি
সবার আগে, আমাদের উইজেট, উপাদান এবং রেন্ডার অবজেক্টগুলি কী তা বুঝতে হবে।
- রেন্ডার অবজেক্টস আসলে স্ক্রিনে রেন্ডার হয়। এগুলি পরিবর্তনযোগ্য , পেইন্টিং এবং বিন্যাস যুক্তিযুক্ত। রেন্ডার ট্রি ওয়েবে ডকুমেন্ট অবজেক্ট মডেল (ডিওএম) এর সাথে খুব মিলে যায় এবং আপনি এই গাছের ডিওএম নোড হিসাবে রেন্ডার অবজেক্টের দিকে নজর দিতে পারেন
- উইজেট - কি রেন্ডার করা উচিত তার একটি বর্ণনা। এগুলি অপরিবর্তনীয় এবং সস্তা। সুতরাং যদি কোনও উইজেট "কী?" (ঘোষণামূলক পদ্ধতির) প্রশ্নের উত্তর দেয় তবে একটি রেন্ডার অবজেক্ট "কিভাবে?" (আবশ্যক পদ্ধতির) প্রশ্নের উত্তর দেয়। ওয়েব থেকে সাদৃশ্যটি একটি "ভার্চুয়াল ডোম"।
- এলিমেন্ট / বিল্ডকন্টেক্সট - উইজেট এবং রেন্ডার অবজেক্টের মধ্যে একটি প্রক্সি । এটিতে * গাছের মধ্যে একটি উইজেটের অবস্থান এবং যখন সম্পর্কিত উইজেট পরিবর্তন করা হয় তখন রেন্ডার অবজেক্টটি কীভাবে আপডেট করবেন সে সম্পর্কিত তথ্য রয়েছে।
এখন আমরা ডুব দিবেন করার জন্য প্রস্তুত হয় InheritedWidget এবং BuildContext এর পদ্ধতি inheritFromWidgetOfExactType ।
উদাহরণ হিসাবে আমি সুপারিশ করি আমরা ইনহিরিটড উইজেট সম্পর্কে ফ্লটারের ডকুমেন্টেশন থেকে এই উদাহরণটি বিবেচনা করব:
class FrogColor extends InheritedWidget {
const FrogColor({
Key key,
@required this.color,
@required Widget child,
}) : assert(color != null),
assert(child != null),
super(key: key, child: child);
final Color color;
static FrogColor of(BuildContext context) {
return context.inheritFromWidgetOfExactType(FrogColor);
}
@override
bool updateShouldNotify(FrogColor old) {
return color != old.color;
}
}
ইনরিটেড উইজেট - কেবলমাত্র একটি উইজেট যা আমাদের ক্ষেত্রে একটি গুরুত্বপূর্ণ পদ্ধতি প্রয়োগ করে - আপডেটশোডনোটাইফাই ।
আপডেটশোল্ডনোটাইফাই - এমন একটি ফাংশন যা একটি প্যারামিটার ওল্ড উইজেট গ্রহণ করে এবং একটি বুলিয়ান মান দেয়: সত্য বা মিথ্যা।
যে কোনও উইজেটের মতো, ইনহেরিটেড উইজেটের সাথে সংশ্লিষ্ট এলিমেন্ট অবজেক্ট থাকে। এটি ইনহেরিটেড এলিমেন্ট । ইনরিটেড এলিমেন্ট কল আপডেটশইড আমরা যখনই নতুন উইজেট তৈরি করি ততবার উইজেটে শট নোট করুন ( পূর্বপুরুষের কাছে কলস্টেট কল করুন)। যখন updateShouldNotify ফেরৎ সত্য মাধ্যমে InheritedElement iterates নির্ভরতা (?) এবং কল পদ্ধতি didChangeDependencies এটিতে।
ইনহরাইটেড এলিমেন্ট নির্ভরতা পায় কোথায় ? এখানে আমাদের উত্তরাধিকারী থেকে উইজেটঅফ এক্স্যাক্ট টাইপ পদ্ধতিটি দেখা উচিত ।
উত্তরাধিকারী থেকে উইজেটঅফেক্স্যাক্ট টাইপ - এই পদ্ধতিটি বিল্ডকন্টেক্সটে সংজ্ঞায়িত করা হয় এবং
প্রতিটি এলিমেন্ট বিল্ডকন্টেক্সট ইন্টারফেস প্রয়োগ করে (এলিমেন্ট == বিল্ডকন্টেক্সট)। সুতরাং প্রতিটি উপাদান এই পদ্ধতি আছে।
ফ্রেম উইজেটঅফ এক্স্যাক্ট টাইপ টাইপের উত্তরের কোডটি দেখতে দিন:
final InheritedElement ancestor = _inheritedWidgets == null ? null : _inheritedWidgets[targetType];
if (ancestor != null) {
assert(ancestor is InheritedElement);
return inheritFromElement(ancestor, aspect: aspect);
}
এখানে আমরা টাইপ অনুসারে ম্যাপযুক্ত _inherisedWidgets এ কোনও পূর্বপুরুষের সন্ধান করার চেষ্টা করি । তাহলে পূর্বপুরুষ পাওয়া যায়, আমরা কি তবে কল inheritFromElement ।
উত্তরাধিকারের জন্য কোডটি থেকে :
InheritedWidget inheritFromElement(InheritedElement ancestor, { Object aspect }) {
assert(ancestor != null);
_dependencies ??= HashSet<InheritedElement>();
_dependencies.add(ancestor);
ancestor.updateDependencies(this, aspect);
return ancestor.widget;
}
- আমরা পূর্ববর্তীকে বর্তমান উপাদানের নির্ভরতা হিসাবে যুক্ত করি (_ নির্ভরতা.এডডি (পূর্বপুরুষ))
- আমরা পূর্বপুরুষের নির্ভরতাগুলিতে বর্তমান উপাদান যুক্ত করি (পূর্বসূরি.অ্যাপডেট নির্ভরতা (এটি, দিক))
- আমরা পূর্বপুরুষের উইজেটটি উত্তরাধিকারী উইজেটঅফ্যাক্স্যাক্ট টাইপ (রিটার্ন পূর্বপুরুষ। উইজেট) এর ফলস্বরূপ প্রত্যাবর্তন করি
সুতরাং এখন আমরা জানি যে ইনহরাইটেড এলিমেন্ট তার নির্ভরতা পায়।
এখন আসুন চ্যাডডেপেন্ডেন্সি পদ্ধতিটি দেখুন method প্রতিটি উপাদানটির এই পদ্ধতি রয়েছে:
void didChangeDependencies() {
assert(_active);
assert(_debugCheckOwnerBuildTargetExists('didChangeDependencies'));
markNeedsBuild();
}
আমরা দেখতে পাচ্ছি যে এই পদ্ধতিটি কেবল একটি উপাদানকে নোংরা হিসাবে চিহ্নিত করে এবং এই উপাদানটি পরবর্তী ফ্রেমে পুনর্নির্মাণ করা উচিত। পুনর্নির্মাণ মানে কোরস্প্যান্ডিং উইজেট উপাদানটিতে কল পদ্ধতি বিল্ড ।
তবে "আমি যখন ইনহিরিটেড উইজেটটি পুনর্নির্মাণ করি তখন পুরো উপ-গাছগুলি পুনর্নির্মাণের বিষয়ে কী?" What এখানে আমাদের মনে রাখা উচিত যে উইজেটগুলি অপরিবর্তনীয় এবং আপনি যদি নতুন উইজেট তৈরি করেন তবে ঝাঁকুনি উপ-গাছটি পুনর্নির্মাণ করবে। কিভাবে আমরা এটা ঠিক করতে পারবো?
- হাতে ক্যাশে উইজেটগুলি (ম্যানুয়ালি)
- কনস্ট ব্যবহার করুন কারণ কনস্ট কেবল মান / শ্রেণীর একমাত্র উদাহরণ তৈরি করে