跳到主要内容

ProviderObserver

ProviderObserver 可以监听ProviderContainer的变更。

要使用它,请扩展ProviderObserver类并重写要使用的方法。

ProviderObserver 有三种方法:

  • 每次初始化provider时都会调用 didAddProvider,并且将值暴露为 value
  • 每次销毁provider时都会调用 didDisposeProvider
  • 每当provider发出通知时,都会调用 didUpdateProvider

用法

ProviderObserver 的一个简单用例是通过重写 didUpdateProvider 方法来记录provider中的更改。


// 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),
),
);
}
}

现在,每当我们的provider的值被更新时,记录器都会记录它:

I/flutter (16783): {
I/flutter (16783): "provider": "counter",
I/flutter (16783): "newValue": "1"
I/flutter (16783): }
备注

对于可变的状态,例如 StateController (StateProvider.state 的状态)和ChangeNotifier, 新旧值将会是相同的。

since they reference the same StateController / ChangeNotifier. 由于他们引用了相同的StateController / ChangeNotifier