使用then获取Flutter Secure Storage Token失败,Dio请求头Token为空
解决Flutter中Dio获取Secure Storage Token为空的问题
问题根源在于异步执行顺序不匹配:你用then调用readSecureData时,getDio方法会继续执行并提前返回Dio实例,此时Token的赋值操作还在异步队列中等待执行,导致请求头里的Token始终为空。
正确实现方式
把getDio改成异步方法,用await等待Token读取完成后再配置Dio,确保流程同步:
1. 保持你的Secure Storage读取类不变
class SecureStorageService { final FlutterSecureStorage _storage = FlutterSecureStorage(); Future<String?> readSecureData(String key) async { String? value = await _storage.read(key: key); print("读取到的Token: $value"); // 正常打印Token return value; } }
2. 修改DioFactory的getDio方法为异步
class DioFactory { final SecureStorageService _secureStorage; DioFactory(this._secureStorage); // 改为返回Future<Dio>,用await等待Token读取 Future<Dio> getDio() async { Dio dio = Dio(); // 阻塞等待Token读取完成 String? token = await _secureStorage.readSecureData("token_key"); if (token != null) { dio.options.headers["Authorization"] = "Bearer $token"; } // 其他Dio基础配置 dio.options.baseUrl = "https://your-api-domain.com"; dio.options.connectTimeout = const Duration(seconds: 10); dio.options.receiveTimeout = const Duration(seconds: 10); return dio; } }
3. 调用时也要用await获取Dio实例
// 在需要使用Dio的地方(比如ViewModel、页面逻辑中) final dio = await DioFactory(SecureStorageService()).getDio(); // 之后正常发起请求 final response = await dio.get("/api/user/profile");
进阶:用Dio拦截器动态添加Token
如果你的Token可能会被刷新(比如过期后重新获取),推荐用Dio拦截器实现每次请求前自动读取并添加Token,更灵活:
Future<Dio> getDio() async { Dio dio = Dio(); dio.interceptors.add(InterceptorsWrapper( onRequest: (options, handler) async { // 每次请求前重新读取Token String? token = await _secureStorage.readSecureData("token_key"); if (token != null) { options.headers["Authorization"] = "Bearer $token"; } handler.next(options); }, )); // 基础配置 dio.options.baseUrl = "https://your-api-domain.com"; return dio; }
内容的提问来源于stack exchange,提问作者Shady Hesham
相关产品推荐
相关产品推荐

