Ana içeriğe atla

ProviderObserver'lar

ProviderObserver, uygulamadaki provider yaşam döngüsü olaylarını gözlemlemek için kullanılan bir nesnedir. Genellikle günlük kaydı (logging), analitik veya hata ayıklama amacıyla kullanılırlar.

Kullanım

Bir ProviderObserver kullanmak için sınıfı genişletmeniz ve gözlemlemek istediğiniz yaşam döngüsü metotlarını geçersiz kılmanız gerekir. Kullanılabilecek çok sayıda metot vardır. Ayrıntılar için dokümantasyonunu incelemeniz önerilir.

Örnek: Logger

Aşağıdaki gözlemci, uygulamadaki herhangi bir provider'ın tüm durum değişikliklerini günlüğe kaydeder:

// A basic logger, which logs any state changes.
final class Logger extends ProviderObserver {

void didUpdateProvider(
ProviderObserverContext context,
Object? previousValue,
Object? newValue,
) {
print('''
{
"provider": "${context.provider}",
"newValue": "$newValue",
"mutation": "${context.mutation}"
}''');
}
}

void main() {
runApp(
ProviderScope(
// ProviderObservers are used by passing them to ProviderScope/ProviderContainer
observers: [
// Adding ProviderScope enables Riverpod for the entire project
// Adding our Logger to the list of observers
Logger(),
],
child: const MyApp(),
),
);
}

// After this, implement a typical Flutter application

Artık provider'ımızın değeri her güncellendiğinde logger bunu kaydedecektir:

{
"provider": "Provider<int>",
"newValue": "1"
}

Hata ayıklamayı kolaylaştırmak için provider'larınıza isteğe bağlı olarak bir ad verebilirsiniz:

final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');

Bu değişiklikle birlikte günlük kaydı şuna dönüşür:

{
"provider": "MyProvider",
"newValue": "1"
}
ipucu

Kod üretimi kullanıldığında provider'lara otomatik olarak bir ad atanır.

NOT

Bir provider'ın durumu yerinde değiştirilirse (genellikle Ref.notifyListeners ile birlikte kullanılan List'lerde), didUpdateProvider metodunun previousValue ve newValue değerlerini aynı değer olarak alması olasıdır.

Bunun nedeni, Dart'ın nesneleri "referans" yoluyla güncellemesidir. Bunu değiştirmek isterseniz, nesnelerinizi değiştirmeden önce kopyalamanız gerekir.