Ana içeriğe atla

Consumer'lar

"Consumer", widget ağacı ile provider ağacı arasındaki boşluğu dolduran bir widget türüdür.

Bir Consumer ile sıradan widget'lar arasındaki tek gerçek fark, Consumer'ların bir Ref'e erişebilmesidir. Bu sayede provider'ları okuyabilir ve değişikliklerini dinleyebilirler. Daha fazla bilgi için Ref'ler sayfasına bakın.

Consumer'lar, çoğunlukla kişisel tercihe bağlı olarak birkaç farklı biçimde gelir. Şunları bulacaksınız:

  • Consumer, bir "builder" widget'ı (FutureBuilder'a benzer). Widget'ların, StatelessWidget veya StatefulWidget dışında bir sınıftan türetilmek zorunda kalmadan provider'larla etkileşime girmesini sağlar.
    // Her zamanki gibi StatelessWidget'tan türetiyoruz
    class MyWidget extends StatelessWidget {

    Widget build(BuildContext context) {
    // FutureBuilder benzeri bir widget
    return Consumer(
    // "builder" geri çağırması bize bir "ref" parametresi verir
    builder: (context, ref, _) {
    // Bu "ref"i provider'ları dinlemek için kullanabiliriz
    final value = ref.watch(myProvider);
    return Text(value.toString());
    },
    );
    }
    }
  • ConsumerWidget, StatelessWidget widget'ının bir çeşidi. StatelessWidget yerine ConsumerWidget'tan türetirsiniz. build metodunun fazladan bir WidgetRef parametresi alması dışında aynı şekilde davranır.
    // StatelessWidget yerine ConsumerWidget'tan türetiyoruz
    class MyWidget extends ConsumerWidget {
    // "build" fazladan bir parametre alır

    Widget build(BuildContext context, WidgetRef ref) {
    // Bu "ref"i provider'ları dinlemek için kullanabiliriz
    final value = ref.watch(myProvider);
    return Text(value.toString());
    }
    }
  • ConsumerStatefulWidget, StatefulWidget widget'ının bir çeşidi.
    Yine, StatefulWidget yerine ConsumerStatefulWidget'tan türetirsiniz. State yerine de ConsumerState'ten türetirsiniz. Buradaki fark, ConsumerState'in bir ref özelliğine sahip olmasıdır.
    // StatefulWidget yerine ConsumerStatefulWidget'tan türetiyoruz
    class MyWidget extends ConsumerStatefulWidget {

    ConsumerState<MyWidget> createState() => _MyWidgetState();
    }
    // State yerine ConsumerState'ten türetiyoruz
    class _MyWidgetState extends ConsumerState<MyWidget> {
    // Bir "this.ref" özelliği kullanılabilir durumdadır

    Widget build(BuildContext context) {
    // Bu "ref"i provider'ları dinlemek için kullanabiliriz
    final value = ref.watch(myProvider);
    return Text(value.toString());
    }
    }

Bunlara ek olarak, hooks_riverpod paketinde başka Consumer'lar da bulacaksınız. Bunlar Riverpod Consumer'larını flutter_hooks ile birleştirir. Hook'larla ilgilenmiyorsanız bunları göz ardı edebilirsiniz.

Hangisini kullanmalı?

Hangi Consumer'ı kullanacağınız çoğunlukla kişisel tercih meselesidir. Her şey için Consumer'ı kullanabilirsiniz. Diğerlerine göre biraz daha uzun bir seçenektir. Ancak Riverpod'un StatelessWidget ve StatefulWidget'ı ele geçirme biçiminden hoşlanmıyorsanız, bu makul bir bedeldir.

Güçlü bir tercihiniz yoksa, ConsumerWidget kullanmanızı öneririz (bir State'e ihtiyacınız olduğunda ise ConsumerStatefulWidget).

Neden StatelessWidget + context.watch kullanamıyoruz?

provider gibi alternatif paketlerde, provider'ları dinlemek için context.watch kullanabilirsiniz. Bu, elinizde bir BuildContext olduğu sürece herhangi bir widget içinde çalışır. Peki Riverpod'da neden böyle değil?

Bunun nedeni, Ref yerine yalnızca BuildContext'e dayanmanın, Riverpod'un

Otomatik yok etme özelliğinin güvenilir bir şekilde geliştirilmesini engelleyecek olmasıdır. `BuildContext` ile "çoğunlukla çalışan" bir uygulama yazmanın yolları _var_. Sorun şu ki, otomatik yok etme özelliğini sessizce bozabilecek çok sayıda ince uç durum bulunuyor.

Bu, bellek sızıntılarına yol açardı; ama asıl mesele bu değil.
Otomatik yok etme, daha çok artık gerek duyulmayan kodun çalışmasını durdurmakla ilgilidir. Otomatik yok etme bir provider'ı yok edemezse, o provider arka planda sürekli olarak ağ istekleri yapmayı sürdürebilir.

Riverpod, birazcık kolaylık uğruna güvenilirlikten ödün vermemeyi tercih etti.

NOT

StatelessWidget/StatefulWidget yerine ConsumerWidget/ConsumerStatefulWidget kullanmak zorunda olmanın olumsuz yanlarını hafifletmek için Riverpod, VSCode ve Android Studio gibi IDE'lerde çeşitli yeniden düzenleme (refactoring) seçenekleri sunar.

Consumer&#39;a dönüştür

Bunları IDE'nizde etkinleştirmek için Başlarken bölümüne bakın.