About riverpod-observers
riverpod-observers is a skill for using Riverpod ProviderObserver lifecycle events to log, analyze, or debug provider changes. It covers attaching observers and naming providers, as well as a caveat about in-place state mutations.
Key features
- 01Observe provider lifecycle events
- 02Attach observers to scopes or containers
- 03Log provider updates
- 04Name providers for clearer logs
- 05Account for in-place mutations
Use cases
- 01Logging provider value changes
- 02Debugging provider behavior
- 03Tracking updates for analytics
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-observersAfter installing, type/riverpod-observersin Claude Code to confirm it loaded.
Details
From the project READMERiverpod — ProviderObservers
Instructions
A ProviderObserver receives lifecycle events for providers (e.g. when a provider's value changes). Use it for logging, analytics, or debugging.
Implementing an observer
Extend ProviderObserver and override the methods you need (e.g. didUpdateProvider). Pass instances to ProviderScope or ProviderContainer via the observers parameter.
Example: logger
final class Logger extends ProviderObserver {
@override
void didUpdateProvider(
ProviderObserverContext context,
Object? previousValue,
Object? newValue,
) {
print('{"provider": "${context.provider}", "newValue": "$newValue"}');
}
}
void main() {
runApp(
ProviderScope(
observers: [Logger()],
child: const MyApp(),
),
);
}
Naming providers
For clearer logs, give providers a name:
final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');
With code generation, a name is usually assigned automatically.
Note on mutations
If state is mutated in place (e.g. a List with ref.notifyListeners), previousValue and newValue in didUpdateProvider may be the same reference. For distinct values, clone before mutating.