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
相关产品推荐
相关产品推荐

