Flutter Riverpod context.read vs Provider ในวิธีการสร้าง

Oct 10 2020

ในเอกสาร 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วิธีการจากนั้นให้คำเตือนเพื่อหลีกเลี่ยง ทำไม?

คำตอบ

3 Suragch Oct 10 2020 at 16:57

buildวิธีสามารถเรียกหลายครั้งในระหว่างการจัดวาง ดังนั้นคุณควรหลีกเลี่ยงการทำงานพิเศษใด ๆ ภายใน (เช่นการเรียกใช้เมธอดในโมเดลของคุณ)

อย่างไรก็ตามการonPressedโทรกลับของRaisedButtonไม่ได้รับการเรียกจริงเมื่อbuildถูกเรียก onPressedจะถูกเรียกเมื่อผู้ใช้กดปุ่มเท่านั้น จากนั้น Riverpod จะอ่านผู้ให้บริการของคุณและเรียกใช้วิธีการในแบบจำลอง ดังนั้นคำเตือนในเอกสารประกอบจึงใช้ไม่ได้ในสถานการณ์นั้น