Flutter中Secure Storage保存Token报错:await仅可用于async方法
问题修复方案
错误原因
await 只能在标记为 async/async* 的方法中使用,但你的 fromJson 是普通构造函数,无法被标记为 async(构造函数不能返回 Future);同时你在构造函数里的变量赋值语法也有误(误用了Map键值对的key:语法,应该用=完成变量赋值)。
修复步骤
1. 修正构造函数的赋值逻辑
先把fromJson里的变量赋值改正确,移除里面的异步存储代码:
class LoginResponseModel { dynamic? key; List<dynamic>? non_field_errors; LoginResponseModel({this.key, this.non_field_errors}); // 修正赋值语法,移除异步操作 LoginResponseModel.fromJson(Map<String, dynamic> mapOfBody) { key = mapOfBody['key']; non_field_errors = mapOfBody['non_field_errors']; print(mapOfBody['key']); } Map<String, dynamic> toJson() { final _data = <String, dynamic>{}; _data['key'] = key; _data['non_field_errors'] = non_field_errors; return _data; } }
2. 封装Token的异步存储与读取方法
在类中添加静态异步方法,专门处理Token的读写,既符合异步语法要求,又能实现便捷访问:
class LoginResponseModel { dynamic? key; List<dynamic>? non_field_errors; LoginResponseModel({this.key, this.non_field_errors}); LoginResponseModel.fromJson(Map<String, dynamic> mapOfBody) { key = mapOfBody['key']; non_field_errors = mapOfBody['non_field_errors']; print(mapOfBody['key']); } Map<String, dynamic> toJson() { final _data = <String, dynamic>{}; _data['key'] = key; _data['non_field_errors'] = non_field_errors; return _data; } // 静态存储Token的异步方法 static Future<void> saveToken(String? token) async { final storage = const FlutterSecureStorage(); await storage.write(key: 'Token', value: token); } // 静态读取Token的异步方法 static Future<String?> getToken() async { final storage = const FlutterSecureStorage(); return await storage.read(key: 'Token'); } }
3. 实际使用方式
- 登录成功后,创建Model并调用存储方法:
// 假设从接口拿到了返回的map数据 final loginModel = LoginResponseModel.fromJson(mapOfBody); // 异步存储Token await LoginResponseModel.saveToken(loginModel.key);
- 读取Token时:
String? token = await LoginResponseModel.getToken();
额外说明
由于FlutterSecureStorage的读写本身是异步操作,无法完全规避await,如果想简化使用,可以在页面初始化时通过FutureBuilder处理异步逻辑,或者提前将Token缓存到内存中,但核心异步逻辑仍需遵守Dart的语法规则。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

