有很多方法可以做到这一点.
- 现在有了一个更新的供应商,(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(...);
}
- 下一个方法是将
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(...);
}
}
- 以下方式更好地表达了实现依赖关系的原则,但与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();
}
}
其思想是将所有必要的依赖项立即传递给类的构造函数.最后,您可以肯定地知道,您的类服务只依赖于构造函数中的服务.
另请注意,我已将所有服务设置为私有,以避免外部访问.如果你不需要,就把田地打开.
- 在调用任何方法时,只需传递
ref
参数:
class NavigatorRepository {
...
Future<dynamic> _get(
Ref ref,
String path, {
Map<String, Object?>? queryParameters,
}) async {
var user = ref.read(userProvider);
}
}
尽管在这里您可以将User user
作为参数传递给该方法并在内部使用它.但显然,可以有更多这样的依赖关系,然后通过ref
就更容易了.