riverpod-observers

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Riverpod — ProviderObservers

Riverpod — ProviderObserver

Instructions

说明

A ProviderObserver receives lifecycle events for providers (e.g. when a provider's value changes). Use it for logging, analytics, or debugging.
ProviderObserver 会接收provider的生命周期事件(例如provider的值发生变化时)。可将其用于日志记录、数据分析或调试。

Implementing an observer

实现观察者

Extend ProviderObserver and override the methods you need (e.g. didUpdateProvider). Pass instances to ProviderScope or ProviderContainer via the
observers
parameter.
继承ProviderObserver并按需重写方法(例如didUpdateProvider)。通过
observers
参数将实例传递给ProviderScopeProviderContainer

Example: logger

示例:日志记录器

dart
final class Logger extends ProviderObserver {
  
  void didUpdateProvider(
    ProviderObserverContext context,
    Object? previousValue,
    Object? newValue,
  ) {
    print('{"provider": "${context.provider}", "newValue": "$newValue"}');
  }
}

void main() {
  runApp(
    ProviderScope(
      observers: [Logger()],
      child: const MyApp(),
    ),
  );
}
dart
final class Logger extends ProviderObserver {
  
  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

为provider命名

For clearer logs, give providers a name:
dart
final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');
With code generation, a name is usually assigned automatically.
为了让日志更清晰,可为provider指定一个名称
dart
final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');
使用代码生成时,通常会自动分配名称。

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.
如果状态是原地修改的(例如使用ref.notifyListeners的List),didUpdateProvider中的
previousValue
newValue
可能指向同一个引用。若需要区分不同的值,请在修改前进行克隆。