Flutter Riverpod context.read vs Provider ในวิธีการสร้าง
ในเอกสาร Riverpod ระบุว่า:
นั่น
context.read(myProvider)คือทางออกเมื่อใช้มันเราสามารถ refactor รหัสก่อนหน้าของเราเป็น:
@override Widget build(BuildContext context) { return RaisedButton( onPressed: () => context.read(counterProvider).state++, child: Text('increment'), ); }โดยการคลิกที่ปุ่มของเรายังคงเพิ่มตัวนับ แต่เราไม่รับฟังผู้ให้บริการอีกต่อไปซึ่งหลีกเลี่ยงการสร้างใหม่ที่ไม่จำเป็น
แต่แล้วมันก็บอกว่า:
ข้อควรระวัง
หลีกเลี่ยงการโทร
context.readภายในbuildวิธีการของวิดเจ็ต หากคุณต้องการปรับการสร้างใหม่ให้เหมาะสมให้ดึงค่าที่ฟังใน Provider แทน
นี่เป็นความสับสนเล็กน้อยสำหรับฉัน ขั้นแรกเอกสารจะให้ตัวอย่างการใช้context.readภายในbuildวิธีการจากนั้นให้คำเตือนเพื่อหลีกเลี่ยง ทำไม?
คำตอบ
buildวิธีสามารถเรียกหลายครั้งในระหว่างการจัดวาง ดังนั้นคุณควรหลีกเลี่ยงการทำงานพิเศษใด ๆ ภายใน (เช่นการเรียกใช้เมธอดในโมเดลของคุณ)
อย่างไรก็ตามการonPressedโทรกลับของRaisedButtonไม่ได้รับการเรียกจริงเมื่อbuildถูกเรียก onPressedจะถูกเรียกเมื่อผู้ใช้กดปุ่มเท่านั้น จากนั้น Riverpod จะอ่านผู้ให้บริการของคุณและเรียกใช้วิธีการในแบบจำลอง ดังนั้นคำเตือนในเอกสารประกอบจึงใช้ไม่ได้ในสถานการณ์นั้น