flutter 双向组合Riverpod提供商

gab6jxml  于 2023-01-31  发布在  Flutter
关注(0)|答案(1)|浏览(143)

我们如何从被 Package 的riverpod提供程序访问方法?

  • ContentProvider * 可以通过"watch"从 * UserProvider * 访问用户值,这个方向没有问题,另一方面,* UserProvider * 也需要访问 * ContentProvider * 的方法,所以需要双向通信。

对于这种情况,我需要从UserProvider调用 * deleteContents * 方法。
我不喜欢为了逻辑安全而将它们合并。

class ContentProviderNotifier extends ChangeNotifier {

  final User? currentUser;
  ContentProviderNotifier({required this.currentUser});
  
  addContent(Content content) {    
    content.user = currentUser?.name;
    ...
  }

  deleteContents() {
    ...
  }

}

final contentProvider = ChangeNotifierProvider<ContentProviderNotifier>(
  (ref) {
    final user = ref.watch(userProvider).currentUser;
    return ContentProviderNotifier(currentUser: user);
  },
);
class UserProviderNotifier extends ChangeNotifier {

  UserProviderNotifier();
  User? currentUser;

  deleteUsers(){
     // here to call a method from contentProvider
     deleteContents();
  }

}

final userProvider = ChangeNotifierProvider<UserProviderNotifier>(
  (ref) {
    return UserProviderNotifier();
  },
);

如果我尝试像这样向UserProvider提供ContentProvider

final userProvider = ChangeNotifierProvider<UserProviderNotifier>(
  (ref) {
    final content = ref.watch(contentProvider); // <----
    return UserProviderNotifier(content);
  },
);

但我知道这说不通。

  • 无法推断"userProvider"的类型,因为它在整个循环中依赖于自身:contentProvider、userProvider。尝试向循环中的一个或多个变量添加显式类型以打破循环。darttop_level_cycle *
odopli94

odopli941#

您可以创建UserProviderNotifier,以便它将ref作为输入,如下所示:

class UserProviderNotifier extends ChangeNotifier {

  UserProviderNotifier(this.ref);

  final Ref ref;

  deleteUsers() {
    // here to call a method from contentProvider
    ref.watch(contentProvider.notifier).deleteContents();
  }

}

final userProvider = ChangeNotifierProvider<UserProviderNotifier>(
      (ref) {
    return UserProviderNotifier(ref);
  },
);

Riverpod文档的这一部分提到这是一个常见用例。

相关问题