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

Flutter登录API报错:'String'不是'index'的'int'子类型求助

问题分析与解决方案

这个错误type 'String' is not a subtype of type 'int' of 'index'的核心原因是你用字符串作为索引去访问了一个需要整数索引的对象(比如数组/List),结合你的代码,主要排查方向如下:

1. 检查后端返回的数据结构

后端可能返回了数组格式的响应(比如[{"success": true, "token": "..."}]),但你直接用val.data['success'](字符串索引)去访问,而数组只能用数字索引(比如val.data[0]['success'])。

解决步骤:
在回调里先打印返回数据,确认结构:

AuthService().login(number, password).then((val) {
  print('返回数据:${val.data}'); // 打印实际返回内容
  // 后续逻辑
});

如果确实是数组,调整索引方式:

if (val.data[0]['success']) {
  var token = val.data[0]['token'];
  // ... 提示逻辑
}

2. 修正请求参数的类型适配

你设置了contentType: Headers.formUrlEncodedContentType(表单编码),但phone是int类型——表单数据要求所有值都是字符串类型,直接传int可能导致Dio编码异常,或后端解析错误返回非预期格式。

解决步骤:
将phone转为字符串后再发送:

// AuthService的login方法中修改data参数
data: {"phone": phone.toString(), "password": password},

3. 明确变量类型,消除动态类型隐患

隐式的动态类型可能导致类型不匹配问题,给方法参数和返回值加上明确注解:

class AuthService {
  Dio dio = Dio();
  // 明确参数类型和返回值类型
  Future<Response<Map<String, dynamic>>> login(int phone, String password) async {
    try {
      return await dio.post<Map<String, dynamic>>(
        'https://parkit-odj8.onrender.com/signin',
        data: {"phone": phone.toString(), "password": password},
        options: Options(contentType: Headers.formUrlEncodedContentType)
      );
    } on DioError catch (e) {
      Fluttertoast.showToast(
          msg: e.response?.data['msg'] ?? '请求失败',
          toastLength: Toast.LENGTH_SHORT,
          gravity: ToastGravity.BOTTOM,
          backgroundColor: Colors.red,
          textColor: Colors.white,
          fontSize: 16.0);
      rethrow; // 重新抛出异常,让上层处理
    }
  }
}

4. 完善异常处理

当前只捕获了Dio请求异常,未处理数据解析异常,添加额外的异常捕获:

RoundedButton(
  colour: Colors.lightBlueAccent,
  title: 'Login',
  onPressed: () {
    AuthService().login(number, password).then((val) {
      try {
        if (val.data['success']) {
          var token = val.data['token'];
          Fluttertoast.showToast(
              msg: 'SUCCESS',
              toastLength: Toast.LENGTH_SHORT,
              gravity: ToastGravity.BOTTOM,
              timeInSecForIosWeb: 1,
              backgroundColor: Colors.green,
              textColor: Colors.white,
              fontSize: 16.0);
        }
      } catch (e) {
        print('数据解析错误:$e');
        Fluttertoast.showToast(msg: '数据解析失败');
      }
    }).catchError((e) {
      print('请求错误:$e');
    });
    print('phone: $number && password:$password');
  },
),

内容的提问来源于stack exchange,提问作者Salaj Subedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:45:33