【发布时间】:2021-08-28 11:48:18
【问题描述】:
我正在向服务器发出请求,但一段时间后access token 过期。我正在使用 Dio,最近遇到了拦截器。当返回401 时,如何向所有调用添加拦截器并使用refresh token 获取access token。
我将tokens 存储在Shared Preferences 中。这是我的代码。
class AuthenticationService {
final Dio _dio;
final LocalDBService _prefs;
AuthenticationService(this._dio, this._prefs);
Future<User?> fetchUser() async {
try {
Tokens _tokens = await _prefs.getTokens();
if (_tokens.accessToken == '') {
return null;
}
final result = await _dio.get(
CURRENT_USER,
options: Options(headers: {
"Authorization": "Bearer ${_tokens.accessToken}",
'Accept': "application/json",
}),
);
User _user = User.fromJson(result.data);
return _user;
} catch (e) {
print("fetcherror");
print(e);
return null;
}
}
}
final authenticationServiceProvider = Provider.autoDispose<AuthenticationService>((ref) {
final _prefs = ref.read(localDBProvider);
final _dio = Dio(); // Need to add interceptors to this
return AuthenticationService(_dio, _prefs);
});
final userProvider = FutureProvider.autoDispose<User?>((ref) {
ref.maintainState = true;
return ref.read(authenticationServiceProvider).fetchUser();
});
如何以及在何处添加拦截器。还想将Dio() 实例移到它自己的类中
【问题讨论】:
-
如果您想在多个提供程序中使用该 dio 实例,那么是的,您应该为该实例创建一个提供程序并在那里添加一个拦截器,然后在所有需要它的提供程序中调用它
-
@EdwynZN 有点卡住创建拦截器。不知道怎么弄的
标签: flutter flutter-provider dio riverpod