ProviderObserver
ProviderObserver наблюдает за изменениями ProviderContainer.
Для работы с ним наследуйтесь от ProviderObserver и переопределите метод, который хотите использовать.
ProviderObserver имеет три метода:
- didAddProviderвызывается каждый раз, когда провайдер инициализируется;- valueявляется хранимым значением.
- didDisposeProviderвызывается каждый раз при аннулировании провайдера.
- didUpdateProviderвызывается каждый раз, когда провайдеры создают уведомление.
Использование:
Простейший вариант использование ProviderObserver это логгирование изменений, происходящих
в провайдере, путем переопределения didUpdateProvider.
// Пример со счетчиком с использованием логгера и riverpod
class Logger extends ProviderObserver {
  
  void didUpdateProvider(
    ProviderBase<Object?> provider,
    Object? previousValue,
    Object? newValue,
    ProviderContainer container,
  ) {
    print('''
{
  "provider": "${provider.name ?? provider.runtimeType}",
  "newValue": "$newValue"
}''');
  }
}
void main() {
  runApp(
    // Добавление ProviderScope делает Riverpod доступным для всего проекта
    // Добавление логгера в список наблюдателей
    ProviderScope(observers: [Logger()], child: const MyApp()),
  );
}
class MyApp extends StatelessWidget {
  const MyApp({super.key});
  
  Widget build(BuildContext context) {
    return MaterialApp(home: Home());
  }
}
final counterProvider = StateProvider((ref) => 0, name: 'counter');
class Home extends ConsumerWidget {
  
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);
    return Scaffold(
      appBar: AppBar(title: const Text('Counter example')),
      body: Center(
        child: Text('$count'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => ref.read(counterProvider.notifier).state++,
        child: const Icon(Icons.add),
      ),
    );
  }
}
Теперь, каждый раз, когда значение провайдера изменяется, логгер выводит сообщение в консоль:
I/flutter (16783): {
I/flutter (16783):   "provider": "counter",
I/flutter (16783):   "newValue": "1"
I/flutter (16783): }
примечание
Для изменяемых состояний как у StateController (это состояние StateProvider.state) и
ChangeNotifier previousValue и newValue будут одинаковыми.
Т. к. они ссылаются на один и тот же StateController / ChangeNotifier.