Flutter中如何用jwtDecoder解析JWT令牌并存入模型访问
如何将JWT解码数据存入自定义Login模型并访问数据
我正在使用jwtDecoder包解码JWT令牌,想要将令牌中的所有数据存入自定义Login模型,之后通过该模型访问数据,请提供指导。
现有代码
获取数据函数
fetchUserData() { Map<String, dynamic> decodedToken = JwtDecoder.decode(storedtoken!); Login.fromJson(decodedToken); loginFromJson(decodedToken); print(decodedToken["lastName"]); }
模型代码
List<Login> loginFromJson(String str) => List<Login>.from(json.decode(str).map((x) => Login.fromJson(x))); String loginToJson(List<Login> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson()))); class Login { Login({ required this.id, required this.firstName, required this.lastName, required this.email, }); String id; String firstName; String lastName; String email; factory Login.fromJson(Map<String, dynamic> json) => Login( id: json["_id"], firstName: json["firstName"], lastName: json["lastName"], email: json["email"], ); Map<String, dynamic> toJson() => { "_id": id, "firstName": firstName, "lastName": lastName, "email": email, }; }
修正步骤及解决方案
移除无用的列表解析函数:
loginFromJson是用来解析数组格式JSON的,但JWT解码后是单个用户的Map数据,这个函数完全用不上,可以直接删掉。保存Login实例:原来的代码里
Login.fromJson(decodedToken)只是创建了Login对象,但没赋值给变量,导致无法后续访问。需要把它赋值给类成员变量或局部变量。处理空值安全:JWT payload里的字段可能为空,建议在
fromJson里添加空值处理,避免运行时错误,比如用??设置默认空字符串。
修正后的获取数据函数
// 定义类成员变量保存用户数据 Login? currentUser; fetchUserData() { Map<String, dynamic> decodedToken = JwtDecoder.decode(storedtoken!); // 创建Login实例并保存 currentUser = Login.fromJson(decodedToken); // 通过模型访问数据 print(currentUser?.lastName); print(currentUser?.email); }
优化后的Login模型(增加空值处理)
class Login { Login({ required this.id, required this.firstName, required this.lastName, required this.email, }); String id; String firstName; String lastName; String email; factory Login.fromJson(Map<String, dynamic> json) => Login( id: json["_id"] ?? "", firstName: json["firstName"] ?? "", lastName: json["lastName"] ?? "", email: json["email"] ?? "", ); Map<String, dynamic> toJson() => { "_id": id, "firstName": firstName, "lastName": lastName, "email": email, }; }
使用说明
现在你可以通过currentUser实例访问所有用户数据,比如currentUser?.firstName、currentUser?.id等,不需要再直接操作解码后的Map,代码更规范安全。
内容的提问来源于stack exchange,提问作者Digamber negi
相关产品推荐
相关产品推荐

