มันสำคัญสำหรับmixins (และเพราะสิ่งนั้นสำหรับคุณเช่นกัน)
มันเป็นกระบวนทัศน์ในกรอบ Flutter Stateจะเรียกวิธีสุดเมื่อเอาชนะวิธีวงจรใน นี่คือเหตุผลที่แม้จะdeactivateมีคำอธิบายประกอบmustCallSuper
นอกจากนี้บางคนmixinคาดหวังว่าคุณจะเรียกวิธีการขั้นสูงของวิธีวงจรชีวิตเหล่านั้นที่จุดเฉพาะในฟังก์ชั่น
ซึ่งหมายความว่าคุณควรปฏิบัติตามเอกสารและเรียกใช้super.dispose เมื่อสิ้นสุดdisposeวิธีการของคุณเนื่องจากmixinอยู่Stateในกรอบงานที่คาดว่าเป็นกรณีนี้
ตัวอย่างเช่น: TickerProviderStateMixinและยืนยันในตอนท้าย:SingleTickerProviderStateMixin super.dispose
ทิกเกอร์ทั้งหมดต้อง [.. ] ถูกกำจัดก่อนโทร super.dispose ()
อีกตัวอย่างหนึ่ง: AutomaticKeepAliveMixinดำเนินการทางตรรกะในและinitStatedispose
ข้อสรุป
เริ่มต้นของคุณinitStateมีsuper.initStateและสิ้นสุดของคุณdisposeด้วยsuper.disposeถ้าคุณต้องการที่จะเป็นทางด้านความง่ายและปลอดภัยเพิ่มเพื่อคุณmixin
นอกจากนี้ให้ทำตามเอกสารประกอบสำหรับวิธีการวงจรชีวิตอื่น ๆ (วิธีการใด ๆ ที่คุณเขียนทับ) เนื่องจากกรอบงานจะคาดหวังว่าคุณจะเรียกวิธีการขั้นสูงดังที่อธิบายไว้ในเอกสารประกอบState
State
ดังนั้นต่อไปนี้คือสิ่งที่คุณควรทำ:
void initState() {
super.initState();
//DO OTHER STUFF
}
แต่มันไม่ได้จริงๆเรื่องStateซึ่งผมจะอธิบายในต่อไปและแม้กระทั่งสำหรับ mixins ก็เพียงเรื่องสำหรับยืนยันการตัดสินจากสิ่งที่ฉันสามารถหา - ดังนั้นจึงจะไม่ส่งผลกระทบต่อการผลิตของคุณแอป
มันไม่สำคัญสำหรับ State
ฉันคิดว่าสองคำตอบก่อนหน้าจากPablo 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);
}
อย่างที่คุณเห็นมีเพียงวงจรการยืนยันและวัตถุประสงค์ของมันคือเพื่อให้แน่ใจว่าวิดเจ็ตของคุณทำงานอย่างถูกต้อง ดังนั้นตราบใดที่คุณโทรหาที่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-statements จะดำเนินการในโหมดดีบักเท่านั้น)
ซึ่งหมายความว่าตราบใดที่คุณโทรหาที่super.dispose ใดที่หนึ่งในวิธีการของคุณเองคุณจะไม่สูญเสียคุณค่าใด ๆ หากไม่มีมิกซ์อินเพิ่มฟังก์ชันการทำงานเพิ่มเติม