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

Flutter项目中如何在不同函数间传递Token密钥值

如何在Flutter的APIService类中跨方法访问登录密钥

你在api_service.dart的登录方法中获取到了密钥Tkey,希望在fetchUser()方法中使用该值,以下是两种可行的实现方案:

方案一:从持久化存储中读取(推荐)

你已经通过SharedService.setLoginDetails()将登录信息持久化存储,直接从SharedService中读取密钥即可,这是最可靠的方式,不会因为APP重启或页面重建丢失数据。

步骤1:确保SharedService能获取登录详情

先在SharedService中实现获取登录信息的方法:

static Future<LoginResponseModel?> getLoginDetails() async {
  // 从SharedPreferences中读取存储的登录信息,转换为LoginResponseModel返回
  // 示例代码(根据你的实际实现调整):
  final prefs = await SharedPreferences.getInstance();
  String? loginData = prefs.getString('login_details');
  if (loginData != null) {
    return loginResponseJson(loginData);
  }
  return null;
}

步骤2:修改fetchUser方法读取密钥

static Future<User> fetchUser() async {
  // 先获取登录详情
  final loginDetails = await SharedService.getLoginDetails();
  if (loginDetails == null) {
    throw Exception('用户未登录');
  }

  var url = Uri.parse(Config.apiURL + Config.userProfileAPI);
  final response = await http.get(
    url,
    headers: {
      HttpHeaders.authorizationHeader: 'Token ${loginDetails.key}',
    },
  );

  final responseJson = jsonDecode(response.body);
  print(responseJson);

  if (response.statusCode == 200) {
    return User.fromJson(jsonDecode(response.body));
  } else {
    throw Exception('Failed to load User');
  }
}

方案二:使用类静态变量存储

在APIService类中定义静态变量存储密钥,登录时赋值,fetchUser时直接使用。需要注意:APP重启后静态变量会清空,所以最好结合持久化存储做兜底。

修改后的APIService代码

class APIService {
  static var client = http.Client();
  static String? _authToken; // 静态变量存储密钥

  static Future<bool> login(LoginRequestModel model) async {
    Map<String, String> requestHeaders = {
      'Content-Type': 'application/json',
    };
    var url = Uri.parse(Config.apiURL + Config.loginAPI);

    var response = await client.post(
      url,
      headers: requestHeaders,
      body: jsonEncode(model.toJson()),
    );

    if (response.statusCode == 200) {
      await SharedService.setLoginDetails(loginResponseJson(response.body));
      _authToken = json.decode(response.body)['key']; // 登录时赋值
      return true;
    } else {
      return false;
    }
  }

  static Future<User> fetchUser() async {
    // 兜底:如果静态变量为空,从持久化存储读取
    if (_authToken == null) {
      final loginDetails = await SharedService.getLoginDetails();
      _authToken = loginDetails?.key;
      if (_authToken == null) throw Exception('用户未登录');
    }

    var url = Uri.parse(Config.apiURL + Config.userProfileAPI);
    final response = await http.get(
      url,
      headers: {
        HttpHeaders.authorizationHeader: 'Token $_authToken',
      },
    );

    final responseJson = jsonDecode(response.body);
    print(responseJson);

    if (response.statusCode == 200) {
      return User.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('Failed to load User');
    }
  }
}

内容的提问来源于stack exchange,提问作者A_K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:01:36