You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:27:12