Kapan menggunakan Provider.of <X> vs. Konsumen <X> di Flutter

13

Aku masih membungkus kepala saya sekitar teknik negara-manajemen dalam mengipas dan saya sedikit bingung tentang kapan dan mengapa untuk menggunakan Provider.of<X>vs Consumer<X>. Saya mengerti (saya pikir) dari dokumentasi bahwa ketika memilih di antara keduanya Anda akan menggunakan Provider.tika kami ingin akses ke data, tetapi Anda tidak perlu UI untuk berubah. Jadi yang berikut (diambil dari dokumen) mendapatkan akses ke data dan memperbarui UI pada acara baru:

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}');
      },
    ),
  ),
);

Padahal, di mana kita hanya perlu data pada tidak ingin membangun kembali dengan UI, kami akan menggunakan Provider.of<X>dengan listenparameter ditetapkan untuk false, seperti di bawah ini:

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

Namun, listentidak diperlukan dan hal berikut ini akan berjalan juga:

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

Jadi ini membawa saya ke beberapa pertanyaan:

  1. Apakah ini cara yang benar untuk membedakan Provider.of<X>dan Consumer<X>. Mantan tidak memperbarui UI, yang terakhir tidak?
  2. Jika listentidak disetel falseapakah widget akan dibangun kembali secara default atau tidak dibangun kembali? Bagaimana jika listendiatur true?
  3. Mengapa ada Provider.ofopsi untuk membangun kembali UI sama sekali saat kita miliki Consumer?
Oprimus
sumber

Jawaban:

17

Itu tidak masalah. Tetapi untuk menjelaskan semuanya dengan cepat:

Provider.ofadalah satu - satunya cara untuk mendapatkan dan mendengarkan suatu objek. Consumer,, Selectordan semua panggilan * ProxyProvider Provider.ofberfungsi.

Provider.ofvs Consumeradalah masalah preferensi pribadi. Tetapi ada beberapa argumen untuk keduanya

Penyedia

  • dapat dipanggil dalam semua siklus widget, termasuk penangan klik dan didChangeDependencies
  • tidak meningkatkan indentasi

Konsumen

  • memungkinkan lebih banyak widget granular dibangun kembali
  • memecahkan sebagian besar penyalahgunaan BuildContext
Rémi Rousselet
sumber
Ini sangat membantu. Saya akan menerima tanggapan ini, terutama untuk orang lain. Tetapi dapatkah Anda menunjuk referensi untuk pernyataan ini: "Provider.of adalah satu-satunya cara untuk mendapatkan dan mendengarkan objek. Konsumen, Selector, dan semua * ProxyProvider memanggil Provider.of untuk bekerja." Ini bukan sesuatu yang saya lihat di dokumen dan itu sangat membantu saya!
Oprimus
2
Ini hanya detail implementasi tentang cara kerja Consumer / ... Inilah sumbernya . Anda dapat melihat bahwa Consumerpada dasarnya tidak lain adalah Provider.ofdi widget baru
Rémi Rousselet
Apakah ada sumber daya tentang belajar untuk mencegah penyalahgunaan BuildContext?
吳 強 福