ProviderObserver
ProviderObserver наблюдает за изменениями ProviderContainer.
Для работы с ним наследуйтесь от ProviderObserver и переопределите метод, который хотите использовать.
ProviderObserver имеет три метода:
didAddProvider
вызывается каждый раз, когда провайдер инициализируется;value
является хранимым значением.didDisposeProvider
вызывается каждый раз при аннулировании провайдера.didUpdateProvider
вызывается каждый раз, когда провайдеры создают уведомление.
Использование:
Простейший вариант использование ProviderObserver это логгирование изменений, происходящих
в провайдере, путем переопределения didUpdateProvider
.
// A Counter example implemented with riverpod with Logger
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(
// Adding ProviderScope enables Riverpod for the entire project
// Adding our Logger to the list of observers
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
.