有人可以告诉我通过事先订阅调用 Riverpod 提供者的方法有什么好处吗?使用不带回调的监听,就像这样?:
@riverpod
FutureOr<Option<User>> signInState(SignInStateRef ref) {
final sub = ref.listen(authStateProvider.notifier, (prev, next) {});
ref.listenSelf((previous, next) {
next.whenData(
(user) {
if (user is Some<User>) {
sub.read().authenticateUser(user.value);
}
},
);
});
不直接做,如下:
@riverpod
FutureOr<Option<User>> signInState(SignInStateRef ref) {
ref.listenSelf((previous, next) {
next.whenData(
(user) {
if (user is Some<User>) {
ref.read(authStateProvider.notifier).authenticateUser(user.value);
}
},
);
});
我已经在项目的各个部分看到过这样做,但我不明白为什么它是一个更好的选择。我怀疑这背后有一个宝贵的学习机会。
谢谢你。
我尝试通过调试收集更多信息,但没有找到任何相关信息。
我收到了代码所有者的回复。我分享它是希望它可以帮助那些想在我们的职业中脱颖而出的人:
从技术上来说,authStateProvider 是否 keepAlive 没有什么区别。 但是,确保听取提供商的意见是一个很好的做法 使用
进行变异时(如果提供者没有其他侦听器 在树里)。ref.read
请参阅以下示例:
@riverpod class Bar extends _$Bar { @override int build() => 0; void increase(int i) { state = state + i; } } @riverpod Future<int> Foo(FooRef ref) { final sub = ref.listen(barProvider.notifier, (prev, next) {}); ref.listenSelf((previous, next) { next.whenData( (state) { sub.read().increase(1); }, ); }); }
如果 barProvider 树中没有监听器并且您直接使用 ref.read,行为会有所不同,因为 barProvider 将是 每次 ref.read 调用都会立即调用并处理。
以下是我从回复中得到的要点:
With providers marked as keepAlive like authStateProvider:
ref.listen
+ sub.read()
还是直接使用 ref.read()
都没有多大关系。On the other hand, with providers not marked as keepAlive:
ref.read()
,则每次调用都会重建提供程序。ref.listen
+ sub.read()
,仅重建一次。keepAlive
的提供商的性能。如果您对此主题有更多评论,欢迎留言!
问候。