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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:15:59