如何在NavigatorRepository类中正确访问userProvider?
解决方法
方法一:给NavigatorRepository注入Ref对象
Provider的实例必须通过Ref对象访问,你可以在NavigatorRepository的构造函数中传入Ref,之后在方法里用它读取userProvider的数据:
- 修改
NavigatorRepository的构造函数:
class NavigatorRepository { final Ref ref; // 注入Ref对象 NavigatorRepository(this.ref); Future<dynamic> _get( String path, { Map<String, Object?>? queryParameters, }) async { // 读取userProvider的当前状态 var x = ref.read(userProvider); // 若需要监听user的动态变化,可改用watch,但异步方法中建议用read获取当前值 // var x = ref.watch(userProvider); } }
- 通过Provider创建
NavigatorRepository实例:
final navigatorRepositoryProvider = Provider((ref) { return NavigatorRepository(ref); });
后续在需要使用NavigatorRepository的地方,通过ref.watch(navigatorRepositoryProvider)获取实例即可。
方法二:将NavigatorRepository定义为Provider的一部分
如果NavigatorRepository本身通过Provider提供,可以直接在Provider内部访问其他Provider:
final navigatorRepositoryProvider = Provider((ref) { // 直接获取userProvider的当前值 final user = ref.watch(userProvider); return NavigatorRepository(user); }); class NavigatorRepository { final User user; NavigatorRepository(this.user); Future<dynamic> _get( String path, { Map<String, Object?>? queryParameters, }) async { // 使用构造函数传入的user var x = user; } }
这种方式适合user不需要动态更新的场景,若后续user会变化,建议用方法一——方法二中的user是创建Repository时的快照,不会同步后续更新。
额外优化:简化UserProvider的使用
你当前定义的额外user Provider是多余的:userProvider的state本身就是User对象,直接通过ref.watch(userProvider)就能拿到当前用户,完全不需要包装一层Provider去调用notifier.getUser()(毕竟getUser()只是返回state)。
内容的提问来源于stack exchange,提问作者Snoopy
相关产品推荐
相关产品推荐

