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

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对象:

  1. extractedData.forEach((userId, userData) {...})中的userId实际是数组的索引(int类型),调用[]方法时自然触发类型错误;
  2. 你判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:05:26