如何不使用列表构建器从Model中提取数据到变量?
从API提取Model数据到指定变量的实现
我通过API获取数据,希望将UserModel中的数据提取到单独的变量中,而非用列表来存储。以下是我目前的代码:
Model 定义
class UserModel { String uid; String userName; String userdesignation; UserModel({ required this.uid, required this.userName, required this.userdesignation, }); factory UserModel.fromMap(Map<String, dynamic> json) => UserModel( uid: json["uid"] ?? '', userName: json["userName"] ?? '', userdesignation: json["userdesignation"] ?? '', ); Map<String, dynamic> toMap() => { "uid": uid, "userName": userName, "userdesignation": userdesignation, }; }
当前UI代码
List<UserModel> userData = <UserModel>[]; var email, designation; Future<void> fetchData() async { email = userData.first.userName.toString(); designation = userData.first.userdesignation.toString(); print(email); }
问题分析
当前代码存在两个关键问题:
userData初始为空列表,直接调用userData.first会触发StateError(空列表无首元素)- 缺少从API拉取数据并解析为
UserModel的核心逻辑
修正方案
根据API返回数据的格式,分两种场景实现:
场景1:API返回单个用户对象
如果接口返回的是单个用户的JSON对象,直接解析为单个UserModel实例,再提取变量:
// 定义单个用户实例变量,替代列表 UserModel? currentUser; var email, designation; Future<void> fetchData() async { // 替换为你的实际API请求逻辑 final response = await http.get(Uri.parse('你的API地址')); if (response.statusCode == 200) { final userJson = jsonDecode(response.body); currentUser = UserModel.fromMap(userJson); // 提取数据到指定变量,空值兜底 email = currentUser?.userName ?? ''; designation = currentUser?.userdesignation ?? ''; print(email); } else { print('请求失败,状态码:${response.statusCode}'); } }
场景2:API返回用户列表,仅需第一个用户数据
如果接口返回用户列表,但你只需要提取第一个用户的信息:
List<UserModel> userData = <UserModel>[]; var email, designation; Future<void> fetchData() async { final response = await http.get(Uri.parse('你的API地址')); if (response.statusCode == 200) { final List<dynamic> usersJson = jsonDecode(response.body); userData = usersJson.map((json) => UserModel.fromMap(json)).toList(); // 先判断列表非空,再提取数据 if (userData.isNotEmpty) { email = userData.first.userName; designation = userData.first.userdesignation; print(email); } else { print('用户列表为空'); } } else { print('请求失败,状态码:${response.statusCode}'); } }
内容的提问来源于stack exchange,提问作者codrikaz
相关产品推荐
相关产品推荐

