Flutter技术问题:storeUserID为空及类型转换异常排查
问题解决方案
一、storeUserID调用API时为空的问题
可能原因
- 赋值时机错误:用户登录/注册成功后,未及时将返回的用户ID赋值给storeUserID
- 未持久化存储:storeUserID是临时变量,App重启后数据丢失
- 异步调用顺序问题:还未获取到用户ID就提前调用了
getUserDetail()方法
修复步骤
- 检查赋值逻辑:确保登录/注册接口返回用户ID后,立即给storeUserID赋值,示例:
// 登录接口示例 Future<void> login() async { var response = await http.post(Uri.parse('登录接口URL')); var data = jsonDecode(response.body); if (response.statusCode == 200) { storeUserID = data['user_id']; // 登录成功后赋值 } } - 持久化存储用户ID:用SharedPreferences把用户ID存在本地,避免重启后丢失:
登录成功后调用// 存储用户ID到本地 Future<void> saveUserID(String id) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('saved_user_id', id); } // 从本地读取用户ID Future<String?> loadUserID() async { final prefs = await SharedPreferences.getInstance(); return prefs.getString('saved_user_id'); }saveUserID(storeUserID),App启动时先调用loadUserID()赋值给storeUserID。 - 确保调用时机正确:调用
getUserDetail前先确认storeUserID不为空,示例:Future<GetUserData> fetchUserInfo() async { String? userId = await loadUserID(); if (userId == null || userId.isEmpty) { // 处理未登录情况,比如跳转登录页 throw Exception('请先登录'); } storeUserID = userId; return await getUserDetail(); }
二、类型转换异常type 'String' is not a subtype of type 'int' of 'index'
问题原因
API返回的是数组格式([{"name":"Taki Rajani",...}]),但GetUserData.fromJson方法是按单个对象(Map)解析的,直接用json['name']会把数组当成Map处理,触发类型错误。
修复方法
修改getUserDetail方法,先从返回的数组中取出第一个元素,再传入fromJson解析:
Future<GetUserData> getUserDetail() async { // 先判断storeUserID是否为空 if (storeUserID == null || storeUserID.isEmpty) { throw Exception('用户ID不能为空'); } var url = "https://aeliya.000webhostapp.com/demo.php?id=$storeUserID"; var response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { var data = jsonDecode(response.body.toString()); // 判断返回的是数组且不为空 if (data is List && data.isNotEmpty) { return GetUserData.fromJson(data[0]); // 取数组第一个元素解析 } else { throw Exception('未查询到用户数据'); } } else { throw Exception('请求失败,状态码:${response.statusCode}'); } }
原代码中else分支直接返回fromJson的逻辑不合理,改成抛出异常更符合错误处理规范。
内容的提问来源于stack exchange,提问作者Taki Rajani
相关产品推荐
相关产品推荐

