วิธี `delaybind` ใน mvvmcross ไม่ได้ใช้โดยตรงเพื่อแก้ไขข้อยกเว้นอ้างอิง null แต่เป็นกลไกในการชะลอการเชื่อมโยงมุมมองจนกว่ามุมมองจะโหลดและพร้อมอย่างเต็มที่ สิ่งนี้สามารถช่วยทางอ้อมในการหลีกเลี่ยงข้อยกเว้นการอ้างอิงที่เป็นโมฆะโดยทำให้มั่นใจว่าการเชื่อมโยงจะพยายามเมื่อส่วนประกอบที่จำเป็นทั้งหมดได้รับการเริ่มต้นอย่างเหมาะสม
ทำงานได้อย่างไร
`โดยทั่วไปจะใช้ในสถานการณ์ที่เค้าโครงหรือตัวควบคุมของมุมมองถูกสร้างขึ้นแบบไดนามิกหรือโหลดแบบอะซิงโครนัส ช่วยให้คุณสามารถชะลอกระบวนการผูกมัดจนกว่ามุมมองจะถูกเตรียมอย่างเต็มที่ซึ่งสามารถป้องกันความพยายามที่จะผูกกับการอ้างอิงที่เป็นโมฆะ
นี่คือวิธีการทั่วไปในการใช้ `delaybind`:
1. การตั้งค่า: ในมุมมองของคุณคุณกำหนดองค์ประกอบ UI และการผูกมัดโดยใช้ `delaybind ' วิธีนี้ไม่ได้ใช้การผูกทันที แต่จะกำหนดเวลาให้ใช้ในภายหลัง
2. การเตรียมการดู: เมื่อมุมมองถูกโหลดอย่างสมบูรณ์และองค์ประกอบ UI ทั้งหมดจะเริ่มต้น MVVMCROSS จะใช้การผูกล่าช้าโดยอัตโนมัติ สิ่งนี้ทำให้มั่นใจได้ว่าการผูกจะมีการพยายามเมื่อมีส่วนประกอบที่จำเป็นทั้งหมดเท่านั้น
3. แอปพลิเคชันที่มีผลผูกพัน: ณ จุดนี้หากส่วนใดส่วนหนึ่งของเส้นทางการเชื่อมโยงเป็นโมฆะข้อยกเว้นการอ้างอิงโมฆะอาจยังคงเกิดขึ้น อย่างไรก็ตามโดยการชะลอการเชื่อมโยงจนกว่ามุมมองจะพร้อมคุณจะลดโอกาสในการเผชิญหน้ากับการอ้างอิงที่เป็นโมฆะเนื่องจากความพยายามในการผูกมัดก่อนกำหนด
การแก้ไขข้อยกเว้นการอ้างอิง null
ในขณะที่ `delaybind` ช่วยในการจัดระเบียบและกำหนดเวลากระบวนการเชื่อมโยงการแก้ไขข้อยกเว้นการอ้างอิง null โดยทั่วไปจะเกี่ยวข้องกับการทำให้มั่นใจว่าวัตถุทั้งหมดที่เกี่ยวข้องในการผูกมัดจะเริ่มต้นอย่างถูกต้องก่อนที่จะพยายามผูกไว้ นี่คือกลยุทธ์บางอย่างเพื่อหลีกเลี่ยงข้อยกเว้นอ้างอิงที่เป็นโมฆะ:
- ตรวจสอบให้แน่ใจว่า ViewModel ถูกตั้งค่า: ตรวจสอบให้แน่ใจว่า ViewModel ถูกตั้งค่าอย่างถูกต้องบนมุมมองก่อนที่จะพยายามผูก สิ่งนี้สามารถตรวจสอบได้โดยการตรวจสอบคุณสมบัติ ViewModel ในวิธีการใช้ชีวิตของมุมมองเช่น `viewDidload` สำหรับ iOS หรือ` onCreate` สำหรับ Android
- ตรวจสอบเส้นทางที่มีผลผูกพัน: ตรวจสอบว่าคุณสมบัติที่คุณมีผลผูกพันใน ViewModel นั้นไม่ได้เป็นโมฆะ หากเป็นเช่นนั้นให้แน่ใจว่าพวกเขาจะเริ่มต้นก่อนที่จะมีผลผูกพัน
- ใช้การเขียนโปรแกรมป้องกัน: ใช้การตรวจสอบในรหัสของคุณเพื่อจัดการการอ้างอิงที่เป็นไปได้ สิ่งนี้สามารถเกี่ยวข้องกับการใช้ตัวดำเนินการแบบไม่มีเงื่อนไข (`?. ') หรือตรวจสอบอย่างชัดเจนสำหรับ NULL ก่อนที่จะทำการลบวัตถุ
- หลีกเลี่ยงการผูกก่อนวัยอันควร: ใช้ `delaybind` หรือกลไกที่คล้ายกันเพื่อให้แน่ใจว่าการผูกจะถูกนำไปใช้เฉพาะเมื่อมุมมองและส่วนประกอบของมันเริ่มต้นอย่างสมบูรณ์
โดยสรุปในขณะที่ `delaybind` ช่วยในการกำหนดเวลากระบวนการเชื่อมโยงอย่างถูกต้อง แต่ก็ไม่สามารถแก้ไขข้อยกเว้นอ้างอิงได้โดยตรง แต่จะช่วยในการจัดระเบียบกระบวนการผูกพันเพื่อลดโอกาสในการเผชิญหน้ากับข้อยกเว้นดังกล่าวโดยทำให้มั่นใจว่าการผูกจะถูกนำไปใช้เมื่อมุมมองพร้อม
การอ้างอิง:[1] https://stackoverflow.com/questions/18954938/nullreference-exception-during-binding-with-mvvmcross
[2] https://www.mvvmcross.com/mvvmcross-9.0.0-release/
[3] https://blog.postsharp.net/nullreferenceexception-object-reference-not-set
[4] https://www.mvvmcross.com/documentation/fundamentals/data-binding
[5] https://stackoverflow.com/questions/27925522/correct-use-of-delaybind-in-mvvmcross
[6] https://pvs-studio.com/en/blog/posts/csharp/1049/
[7] https://www.mvvmcross.com/documentation/fundamentals/linking
[8] https://github.com/mvvmcross/mvvmcross/issues/1508