flutter 类中的访问提供程序

w46czmvw  于 2023-06-30  发布在  Flutter
关注(0)|答案(2)|浏览(116)

我有一个名为NavigatorRepository的类,我试图访问它,userProvider。我应该如何访问NavigatorRepository中的userProvider?我觉得我什么都试过了除了正确的。。
下面是NavigatorRepository的一个片段

final user = Provider((ref) {
  return ref.watch(userProvider.notifier).getUser();
});
...

class NavigatorRepository {

...

  Future<dynamic> _get(
    String path, {
    Map<String, Object?>? queryParameters,
  }) async {
  
    var x = user; <== How do I get this to work?
}
 

}

UserProvider

class UserNotifier extends StateNotifier<User> {
  UserNotifier()
      : super(User(accessToken: '');

  void setUser(User user) {
    state = user;
  }

  User getUser() {
    return state;
  }
}

final userProvider = StateNotifierProvider<UserNotifier, User>((ref) {
  return UserNotifier();
});
htzpubme

htzpubme1#

我发现这篇文章涵盖了我正在做的事情。
https://github.com/rrousselGit/riverpod/issues/295#issuecomment-770384596

ecfdbz9o

ecfdbz9o2#

有很多方法可以做到这一点。
1.现在有一个更新的提供程序(Async)NotifierProvider用于此目的:

final navigatorProvider = NotifierProvider<NavigatorRepository, void>(() {
  return NavigatorRepository();
});

class NavigatorRepository extends Notifier<void> {
  
  @override
  void build() {
    // you can use ref.watch in this method
    User user = ref.watch(userProvider);
  }

  func() {
    // ref is available in any methods of the NavigatorRepository class
    ref.read(...);
  }

1.下一个方法是将ref参数传递给类构造函数:

final navigatorProvider = Provider<NavigatorRepository>(NavigatorRepository.new);

class NavigatorRepository {
  NavigatorRepository(this._ref);

  final Ref _ref;

  func() {
    // ref is available in any methods of the NavigatorRepository class
    _ref.read(...);
  }
}

1.以下方式更好地表达了实现依赖关系的原则,但与Riverpod中的设计模式相反:

final navigatorProvider = Provider<NavigatorRepository>((ref) {
  return NavigatorRepository(
    authService: ref.watch(AuthService),
    settingService: ref.watch(SettingService),
    userService: ref.watch(UserService),
  );
});

class NavigatorRepository {
  UserService({
    required AuthService authService,
    required SettingService settingService,
    required UserService userService,
  })  : _authService = authService,
        _settingService = settingService,
        _UserService = userService;

  final AuthService _authService;
  final SettingService _settingService;
  final UserService _userService;

  func() {
    // simply call the method
    User user = _userService.getUser();
  }
}

其思想是将所有必要的依赖项立即传递给类的构造函数。最后,您可以确定您的类服务只依赖于构造函数中的服务。
还请注意,我已经将所有服务设置为私有,以避免外部访问。如果你不需要,就把田打开。
1.在调用任何方法时,只需传递ref参数即可:

class NavigatorRepository {
  ...

  Future<dynamic> _get(
    Ref ref,
    String path, {
    Map<String, Object?>? queryParameters,
  }) async {
    var user = ref.read(userProvider);
  }
}

虽然在这里你可以把User user作为参数传递给方法并在内部使用它。但显然可以有更多这样的依赖项,然后只传递ref会更容易。

相关问题