เมื่อใดจึงควรใช้ Provider.of <X> vs. Consumer <X> ใน Flutter


13

ฉันยังคงตัดหัวของฉันรอบเทคนิครัฐจัดการในกระพือและกำลังบิตสับสนเกี่ยวกับเวลาและเหตุผลที่จะใช้กับProvider.of<X> Consumer<X>ฉันเข้าใจ (ฉันคิดว่า) จากเอกสารที่เมื่อเลือกระหว่างสองสิ่งนี้คุณจะใช้ Provider.of เมื่อเราต้องการเข้าถึงข้อมูล แต่คุณไม่จำเป็นต้องเปลี่ยน UI ดังนั้นต่อไปนี้ (นำมาจากเอกสาร) จะสามารถเข้าถึงข้อมูลและอัปเดต UI ในกิจกรรมใหม่:

return HumongousWidget(
  // ...
  child: AnotherMonstrousWidget(// <- This widget will rebuild on new data events
    // ...
    child: Consumer<CartModel>(
      builder: (context, cart, child) {
        return Text('Total price: ${cart.totalPrice}');
      },
    ),
  ),
);

ในขณะที่เราต้องการเพียงข้อมูลที่ไม่ต้องการสร้างใหม่ด้วย UI เราจะใช้Provider.of<X>กับlistenพารามิเตอร์ที่ตั้งค่าfalseดังต่อไปนี้:

Provider.of<CartModel>(context, listen: false).add(item); \\Widget won't rebuild

อย่างไรก็ตามlistenไม่จำเป็นต้องใช้และสิ่งต่อไปนี้จะทำงานด้วย:

Provider.of<CartModel>(context).add(item); \\listener optional

ดังนั้นสิ่งนี้ทำให้ฉันมีคำถามสองสามข้อ:

  1. นี่คือวิธีที่ถูกต้องที่จะแยกแยะและProvider.of<X> Consumer<X>อดีตไม่อัปเดต UI ผู้ใช้รุ่นหลังทำ
  2. หากlistenไม่ได้ตั้งค่าfalseเป็นเครื่องมือจะถูกสร้างใหม่ตามค่าเริ่มต้นหรือไม่สร้างใหม่ ถ้าlistenตั้งไว้เป็นtrueอะไร
  3. ทำไมมีProvider.ofตัวเลือกในการสร้าง UI ทั้งหมดเมื่อเรามีConsumer?

คำตอบ:


17

มันไม่สำคัญ แต่เพื่ออธิบายสิ่งต่าง ๆ อย่างรวดเร็ว:

Provider.ofเป็นวิธีเดียวที่จะได้รับและฟังวัตถุ Consumer,, Selectorและ * ProxyProvider ทั้งหมดเรียกProvider.ofให้ทำงาน

Provider.ofvs Consumerเป็นเรื่องของการตั้งค่าส่วนตัว แต่มีข้อโต้แย้งเล็กน้อยสำหรับทั้งคู่

Provider.of

  • สามารถเรียกใช้ในวงจรชีวิตวิดเจ็ตทั้งหมดรวมถึงตัวจัดการการคลิกและ didChangeDependencies
  • ไม่เพิ่มการเยื้อง

ผู้บริโภค

  • อนุญาตให้สร้างวิดเจ็ตแบบละเอียดมากขึ้น
  • แก้ BuildContext ส่วนใหญ่ในทางที่ผิด

สิ่งนี้มีประโยชน์ ฉันจะยอมรับคำตอบนี้โดยเฉพาะอย่างยิ่งสำหรับคนอื่น ๆ แต่คุณสามารถชี้ไปที่การอ้างอิงสำหรับคำสั่งนี้: "Provider.of เป็นวิธีเดียวที่จะได้รับและฟังวัตถุ Consumer, Selector และ * ProxyProvider ทั้งหมดเรียกให้ Provider.of ทำงาน" นี่ไม่ใช่สิ่งที่ฉันเห็นในเอกสารและมันช่วยฉันได้จริงๆ!
Oprimus

2
นี่เป็นเพียงรายละเอียดการติดตั้งว่า Consumer / ... ทำงานอย่างไร นี่คือแหล่งที่มา คุณจะเห็นได้ว่าConsumerไม่มีอะไรนอกจากProvider.ofเครื่องมือใหม่
Rémi

มีแหล่งข้อมูลเกี่ยวกับการเรียนรู้เพื่อป้องกัน BuildContext ในทางที่ผิดหรือไม่?
吳強福
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.