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,
StatelessWidgetveyaStatefulWidgetdışı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,
StatelessWidgetwidget'ının bir çeşidi.StatelessWidgetyerineConsumerWidget'tan türetirsiniz.buildmetodunun 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,
StatefulWidgetwidget'ının bir çeşidi.
Yine,StatefulWidgetyerineConsumerStatefulWidget'tan türetirsiniz.Stateyerine de ConsumerState'ten türetirsiniz. Buradaki fark, ConsumerState'in birrefö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
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.
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.

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