我有一个名为NavigatorRepository的类,我正在try 访问它,userProvider.我应该如何访问NavigatorRepository内的用户Provider ?我觉得我什么都试过了,除了正确的事.

下面是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();
});

推荐答案

有很多方法可以做到这一点.

  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就更容易了.

Flutter相关问答推荐

在Riverpod ConsumerWidget中使用文本编辑控制器

我可以在iOS设备上使用Ffltter实现Google Pay按钮吗?

Build.gradle专线:2个Flutter Flutter

Flutter 图标记移动

如何在应用程序中使用Fflight显示表情包

SingleChildScrollView在ErrorWidget.builder中不工作

如何在巡逻测试期间重新启动dart 侧应用程序状态?

如何在Flutter中将背景 colored颜色 更改为黑色?

在 Flutter 中使用条件语句设置 ImageProvider Object 类型的背景图像

NotifierProvider 每次更新都会重新构建并且值不更新

无法在 Flutter 项目中安装最新版本的 image_picker

Flutter 使用扩展的 TextField 定位小部件

Flutter - 我需要显示文本,但应用程序不需要

graphql_flutter 错误:非抽象类GraphQLWebSocketChannel缺少实现

如何从 showModalBottomSheet 中的 topRight 和 topLeft 移除平边

如何在 Flutter 中将列小部件添加到行小部件?

Flutter Web Responsiveness 效率不高

用于空值 FirebaseFirestore 的空值判断运算符

RangeError(索引):无效值:有效值范围为空:点击文章时为0

Flutter:如何将 AssetImage 转换为 Unit8List?