टी एल; डॉ
अंदर भारी गणना का उपयोग न करें updateShouldNotify विधि और उपयोग स्थिरांक के बजाय नया जब एक विजेट बनाने
सबसे पहले, हमें यह समझना चाहिए कि एक विजेट, एलीमेंट और रेंडर ऑब्जेक्ट क्या हैं।
- रेंडर ऑब्जेक्ट्स वास्तव में स्क्रीन पर प्रस्तुत किए गए हैं। वे म्यूट हैं, पेंटिंग और लेआउट तर्क शामिल हैं। रेंडर ट्री वेब में डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) के समान है और आप ट्री में DOM के रूप में रेंडर ऑब्जेक्ट देख सकते हैं
- विजेट - क्या प्रदान किया जाना चाहिए का एक विवरण है। वे अपरिवर्तनीय और सस्ते हैं। इसलिए यदि कोई विजेट "क्या?" (डिक्लेरेटिव अप्रोच) के सवाल का जवाब देता है, तो एक रेंडर ऑब्जेक्ट "हाउ?" (इंपीरियल अप्रोच) के सवाल का जवाब देता है। वेब से एक सादृश्य "वर्चुअल डोम" है।
- तत्व / BuildContext - विजेट और रेंडर ऑब्जेक्ट्स के बीच एक प्रॉक्सी है । इसमें पेड़ में एक विजेट की स्थिति के बारे में जानकारी शामिल है * और इसी विजेट को बदलने पर रेंडर ऑब्जेक्ट को कैसे अपडेट किया जाए।
अब हम 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;
}
}
InheritedWidget - सिर्फ एक विजेट जो हमारे मामले में लागू होता है एक महत्वपूर्ण विधि - updateShouldNotify ।
updateShouldNotify - एक फ़ंक्शन जो एक पैरामीटर ओल्डविडगेट को स्वीकार करता है और एक बूलियन मान लौटाता है: सही या गलत।
किसी भी विजेट की तरह, InheritedWidget में एक तत्व तत्व होता है। यह InheritedElement है । हर बार जब हम एक नया विजेट बनाते हैं तो इनहेरिट की गई कॉल अपडेट को अपडेट करें ( एक पूर्वज पर कॉल सेट करें )। जब updateShouldNotify रिटर्न सच के माध्यम से InheritedElement दोहराता निर्भरता (?) और कॉल विधि didChangeDependencies उस पर।
इनहेरीटेडमेंट में निर्भरता कहाँ मिलती है ? यहाँ हमें inheritFromWidgetOfExactType मेथड को देखना चाहिए ।
inheritFromWidgetOfExactType - इस विधि में BuildContext और प्रत्येक तत्व के रूप में परिभाषित किया गया है
BuildContext इंटरफ़ेस (तत्व == BuildContext)। इसलिए प्रत्येक तत्व में यह विधि है।
के कोड को देखें inheritFromWidgetOfExactType:
final InheritedElement ancestor = _inheritedWidgets == null ? null : _inheritedWidgets[targetType];
if (ancestor != null) {
assert(ancestor is InheritedElement);
return inheritFromElement(ancestor, aspect: aspect);
}
यहाँ हम _inheritedWidgets प्रकार में मैप किए गए पूर्वजों को खोजने का प्रयास करते हैं । यदि पूर्वज पाया जाता है, तो हम विरासत को कहते हैं ।
InheritFromElement के लिए कोड :
InheritedWidget inheritFromElement(InheritedElement ancestor, { Object aspect }) {
assert(ancestor != null);
_dependencies ??= HashSet<InheritedElement>();
_dependencies.add(ancestor);
ancestor.updateDependencies(this, aspect);
return ancestor.widget;
}
- हम पूर्वज को वर्तमान तत्व की निर्भरता के रूप में जोड़ते हैं (_d dependencies.add (पूर्वज))
- हम वर्तमान तत्व को पूर्वज की निर्भरता (ancestor.updateD dependencies (यह, पहलू)) से जोड़ते हैं
- हम inheritFromWidgetOfExactType के परिणाम के रूप में पूर्वजों का विजेट लौटाते हैं (पूर्वजों को वापस भेजें )
तो अब हम जानते हैं कि InheritedElement को अपनी निर्भरता कहाँ मिलती है।
अब doChangeD निर्भरता विधि पर नजर डालते हैं । प्रत्येक तत्व में यह विधि है:
void didChangeDependencies() {
assert(_active); // otherwise markNeedsBuild is a no-op
assert(_debugCheckOwnerBuildTargetExists('didChangeDependencies'));
markNeedsBuild();
}
जैसा कि हम देख सकते हैं कि यह विधि केवल एक तत्व को गंदे के रूप में चिह्नित करती है और इस तत्व को अगले फ्रेम पर फिर से बनाया जाना चाहिए। पुनर्निर्माण का मतलब है , कॉलस्पैंडिंग विजेट तत्व पर कॉल विधि का निर्माण ।
लेकिन जब मैं InheritedWidget का पुनर्निर्माण करता हूं, तो "उप-ट्री के पुनर्निर्माण के बारे में क्या"। यहां हमें याद रखना चाहिए कि विजेट अपरिवर्तनीय हैं और यदि आप नया विजेट बनाते हैं तो फ़्लटर उप-ट्री का पुनर्निर्माण करेगा। हम इसे कैसे ठीक कर सकते हैं?
- हाथों से कैश विजेट (मैन्युअल)
- Const का उपयोग करें क्योंकि const मान / वर्ग का केवल एक उदाहरण बनाते हैं