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