Flutter 如何使用Riverpod处理身份验证令牌和GraphQL客户端?
我们正在使用GraphQL将我们的后端与我们的mobil应用程序连接起来。我们正在使用Riverpod来处理全局状态、依赖注入等 我们正在使用一个提供者来处理GraphQL客户端,在用户未进行身份验证(这将处理未经身份验证的请求,如登录或注册)时,首先不使用任何身份验证标头,然后对用户进行身份验证,提供令牌的令牌提供程序将被更新,并且它必须更新作为应用程序上每个存储库的用户的客户端提供程序:Flutter 如何使用Riverpod处理身份验证令牌和GraphQL客户端?,flutter,dart,graphql,riverpod,Flutter,Dart,Graphql,Riverpod,我们正在使用GraphQL将我们的后端与我们的mobil应用程序连接起来。我们正在使用Riverpod来处理全局状态、依赖注入等 我们正在使用一个提供者来处理GraphQL客户端,在用户未进行身份验证(这将处理未经身份验证的请求,如登录或注册)时,首先不使用任何身份验证标头,然后对用户进行身份验证,提供令牌的令牌提供程序将被更新,并且它必须更新作为应用程序上每个存储库的用户的客户端提供程序: final StateProvider<String> tokenProvider =
final StateProvider<String> tokenProvider =
StateProvider<String>((_) => '', name: "Token Provider");
在这一点上,我们不明白这里的问题是什么
更新
我们删除了StateNotifier及其提供程序中的这些更改
通过读取在存储库中获取客户端不会避免以下错误:
使用Riverpod处理授权令牌和GraphQL客户端的正确方法是什么
谢谢。我认为错误在您的AuthNotifier中:
if (sessionUser.confirmed != false) {
tokenController.state = sessionUser.token!; <-- you are updating a dependencie of your actual AuthNotifier object
}
await dataStore.writeUserProfile(sessionUser); <-- during the await a new object is created and the actual instance is disposed so this line will throw
if(sessionUser.confirm!=false){
tokenController.state=sessionUser.token!;问题在于authRepositoryProvider
:
final authRepositoryProvider=Provider是的,这就是问题所在,那么,我们如何解决它呢?将tokenController:ref.watch(tokenProvider.notifier)替换为tokenController:ref.read(tokenProvider.notifier)在您的AuthNotifierProvider中,您使用的是什么版本的Riverpod?我仍然在使用hooks\u Riverpod:^0.14.0+4
。添加使用AuthNotifierRok的片段,我尝试了第一个,问题仍然存在,因此,我猜解决方案是第二个。谢谢。第二个没有成功。新错误是什么?是同一个ror,没有变化。
final authRepositoryProvider = Provider<AuthRepository>(
(ref) => GraphQLAuthRepository(client: ref.read(graphQLClientProvider)),
name: 'Auth Repository Provider',
);
final authNotifierProvider = StateNotifierProvider<AuthNotifier, AuthState>(
(ref) => AuthNotifier(
authRepository: ref.watch(authRepositoryProvider),
dataStore: ref.watch(dataStoreRepositoryProvider),
profileRepository: ref.watch(profileRepositoryProvider),
tokenController: ref.watch(tokenProvider.notifier),
userController: ref.watch(userEntityProvider.notifier),
),
name: "Authentication Notifier Provider",
);
Future<String?> signIn({
required String username,
required String password,
}) async {
try {
final Map<String, dynamic> rawUser = await authRepository.signIn(
identifier: username, password: password) as Map<String, dynamic>;
final User sessionUser = User.fromJson(rawUser);
if (sessionUser.confirmed != false) {
tokenController.state = sessionUser.token!; <-- Bug begins here
}
await dataStore.writeUserProfile(sessionUser);
userController.state = sessionUser;
state = const AuthState.loggedIn();
} on LogInFailureByBadRequest {
return "E-posta veya şifre geçersiz.";
} on LogInFailure catch (error) {
return error.toString();
}
}
AuthNotifier(
this._ref, {
required this.authRepository,
required this.profileRepository,
required this.dataStore,
required this.tokenController,
required this.userController,
}) : super(const AuthState.loading());
final ProviderReference _ref;
final ProfileRepository profileRepository;
final AuthRepository authRepository;
final DataStoreRepository dataStore;
final StateController<User?> userController;
final StateController<String> tokenController;
if (sessionUser.confirmed != false) {
tokenController.state = sessionUser.token!; <-- you are updating a dependencie of your actual AuthNotifier object
}
await dataStore.writeUserProfile(sessionUser); <-- during the await a new object is created and the actual instance is disposed so this line will throw