努力成为一名更好的 Flutter 程序员

问题描述 投票:0回答:1

有人可以告诉我通过事先订阅调用 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);
        }
      },
    );
  });

我已经在项目的各个部分看到过这样做,但我不明白为什么它是一个更好的选择。我怀疑这背后有一个宝贵的学习机会。

谢谢你。

我尝试通过调试收集更多信息,但没有找到任何相关信息。

flutter dart domain-driven-design clean-architecture
1个回答
0
投票

我收到了代码所有者的回复。我分享它是希望它可以帮助那些想在我们的职业中脱颖而出的人:

从技术上来说,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
    的提供商的性能。

如果您对此主题有更多评论,欢迎留言!

问候。

© www.soinside.com 2019 - 2024. All rights reserved.