Flutter报错NoSuchMethodError: int类无[]方法问题求助
问题描述
调试时能正常显示数据库内容,但调用API后抛出错误:Unhandled Exception: NoSuchMethodError: Class 'int' has no instance method '[]',应用显示空数据,存储值的列表长度为0。
UserDetails类代码
class UserDetails extends ChangeNotifier { final String? userId; final String? mobileno; bool? userStatus; final String? adhar; final String? pan; final String? adharno; final String? panno; UserDetails( {this.userId, this.mobileno, this.userStatus = false, this.adhar, this.pan, this.adharno, this.panno}); }
出错的API请求代码
Future<void> getUsers(BuildContext context) async { final url = '${PurohitApi().baseUrl}${PurohitApi().users}'; final List<UserDetails> loadedUsers = []; try { final client = RetryClient( http.Client(), retries: 4, when: (response) { return response.statusCode == 401 ? true : false; }, onRetry: (req, res, retryCount) async { //print('retry started $token'); if (retryCount == 0 && res?.statusCode == 401) { var accessToken = await Provider.of<Auth>(context, listen: false) .restoreAccessToken(); // Only this block can run (once) until done req.headers['Authorization'] = accessToken; } }, ); var response = await client.get( Uri.parse(url), headers: {'Authorization': authToken!}, ); final extractedData = json.decode(response.body) as Map<String, dynamic>; print(extractedData); if (extractedData['data'] == null) { return; } extractedData.forEach((userId, userData) { print(userId); loadedUsers.add( UserDetails( userId: userData['data']['id'], mobileno: userData['data']['mobileno'], userStatus: userData['data']['userstatus'], adhar: userData['data']['adhar'], pan: userData['data']['pan'], adharno: userData['data']['adharno'], panno: userData['data']['panno'], ), ); }); _users = loadedUsers.reversed.toList(); //print(users); notifyListeners(); } catch (e) { print(e); } }
错误原因分析
API返回的extractedData['data']是数组列表,但你错误地遍历了整个extractedData对象:
extractedData.forEach((userId, userData) {...})中的userId实际是数组的索引(int类型),调用[]方法时自然触发类型错误;- 你判断
extractedData['data'] == null就返回,但后续根本没去处理extractedData['data']这个真实的用户数据数组,导致loadedUsers始终为空。
修复方案
修改数据解析逻辑,正确处理API返回的数组结构:
Future<void> getUsers(BuildContext context) async { final url = '${PurohitApi().baseUrl}${PurohitApi().users}'; final List<UserDetails> loadedUsers = []; try { final client = RetryClient( http.Client(), retries: 4, when: (response) => response.statusCode == 401, onRetry: (req, res, retryCount) async { if (retryCount == 0 && res?.statusCode == 401) { var accessToken = await Provider.of<Auth>(context, listen: false) .restoreAccessToken(); req.headers['Authorization'] = accessToken; } }, ); var response = await client.get( Uri.parse(url), headers: {'Authorization': authToken!}, ); final extractedData = json.decode(response.body) as Map<String, dynamic>; print(extractedData); // 直接获取用户数据数组,为空则返回 final userList = extractedData['data'] as List?; if (userList == null || userList.isEmpty) { return; } // 遍历数组中的每个用户对象 for (var userData in userList) { loadedUsers.add( UserDetails( userId: userData['id'], mobileno: userData['mobileno'], userStatus: userData['userstatus'], adhar: userData['adhar'], pan: userData['pan'], adharno: userData['adharno'], panno: userData['panno'], ), ); } _users = loadedUsers.reversed.toList(); notifyListeners(); } catch (e) { print(e); } }
关键修改点
- 直接提取
extractedData['data']作为用户列表数组,增加空数组判断 - 使用
for-in遍历数组,每个userData就是完整的用户数据,无需再嵌套取data字段 - 移除错误的
extractedData.forEach遍历,避免将数组索引当作Map键处理
内容的提问来源于stack exchange,提问作者Santosh Kumar
相关产品推荐
相关产品推荐

