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

Flutter中调用API模型数据求和报错,请求技术排查

问题:API返回数据求和运算报错

我想对API返回的模型数据做求和运算,但执行时出错,不确定是拼写错误还是API调用方式有问题。错误截图显示运算相关类型错误(原外链已移除)。

求和逻辑代码

Expanded(
              child: ListView.builder(
                physics: const BouncingScrollPhysics(),
                itemCount: data.length,
                itemBuilder: (context, index) {
                  var nilaiIndeksUts = 0;
                  var nilaiIndeksAkhir = 1;
                  var result = nilaiIndeksUts + nilaiIndeksAkhir;
                  return Padding(
                    padding: const EdgeInsets.only(
                      bottom: 6,
                      top: 6,
                    ),
                    child: Container(
                      decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: const BorderRadius.all(
                          Radius.circular(8),
                        ),
                        boxShadow: [
                          BoxShadow(
                            color: Colors.grey.withOpacity(0.2),
                            spreadRadius: 1,
                            blurRadius: 9,
                            offset: const Offset(
                              1,
                              2,
                            ),
                          ),
                        ],
                      ),
                      width: double.infinity,
                      child: Padding(
                        padding: const EdgeInsets.all(16),
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(
                              data[index].nmMk ?? '',
                              style: bold5,
                            ),
                            const Divider(),
                            Table(
                              defaultColumnWidth: const FlexColumnWidth(),
                              border: const TableBorder(
                                verticalInside: BorderSide.none,
                              ),
                              children: [
                                TableRow(children: [
                                  Column(
                                    children: [
                                      Text(
                                        'Kode MK',
                                        style: regular7,
                                      )
                                    ],
                                  ),
                                  Column(
                                    children: [
                                      Text(
                                        'Huruf Mutu',
                                        style: regular7,
                                      )
                                    ],
                                  ),
                                  Column(
                                    children: [
                                      Text(
                                        'Angka Mutu',
                                        style: regular7,
                                      )
                                    ],
                                  ),
                                  Column(
                                    children: [
                                      Text(
                                        'Mutu SKS',
                                        style: regular7,
                                      )
                                    ],
                                  ),
                                  Column(
                                    children: [
                                      Text(
                                        'Nilai Mutu',
                                        style: regular7,
                                      )
                                    ],
                                  ),
                                ]),
                                TableRow(children: [
                                  Column(children: [
                                    Text(
                                      '${data[index].kodeMk}',
                                      style: bold6,
                                    )
                                  ]),
                                  Column(children: [
                                    Text(
                                      '${data[index].nilaiHurufUts}',
                                      style: bold6,
                                    )
                                  ]),
                                  Column(children: [
                                    Text(
                                      '${data[index].nilaiIndeksAkhir}',
                                      style: bold6,
                                    )
                                  ]),
                                  Column(children: [
                                    Text(
                                      '${data[index].sks}',
                                      style: bold6,
                                    ),
                                  ]),
                                  Column(children: [
                                    Text(
                                      '$result',
                                      // '${data[index].nilaiIndeksAkhir} ',
                                      style: bold6,
                                    ),
                                  ]),
                                ]),
                              ],
                            ),

API模型类

class NilaiMahasiswa {
  String? status;
  String? code;
  List<Data>? data;

  NilaiMahasiswa({this.status, this.code, this.data});

  NilaiMahasiswa.fromJson(Map<String, dynamic> json) {
    status = json['status'];
    code = json['code'];
    if (json['data'] != null) {
      data = <Data>[];
      json['data'].forEach((v) {
        data!.add(Data.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['status'] = status;
    data['code'] = code;
    if (this.data != null) {
      data['data'] = this.data!.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Data {
  String? idTranskripNilai;
  String? idMk;
  String? kodeMk;
  String? nmMk;
  int? sks;
  int? smt;
  String? nilaiAkhirUts;
  String? nilaiHurufUts;
  String? nilaiIndeksUts;
  String? nilaiAkhirUas;
  String? nilaiAkhir;
  String? nilaiHurufAkhir;
  String? nilaiIndeksAkhir;
  int? statusNilaiAkhir;
  int? statusNilaiUts;
  String? updatedBy;

  Data(
      {this.idTranskripNilai,
      this.idMk,
      this.kodeMk,
      this.nmMk,
      this.sks,
      this.smt,
      this.nilaiAkhirUts,
      this.nilaiHurufUts,
      this.nilaiIndeksUts,
      this.nilaiAkhirUas,
      this.nilaiAkhir,
      this.nilaiHurufAkhir,
      this.nilaiIndeksAkhir,
      this.statusNilaiAkhir,
      this.statusNilaiUts,
      this.updatedBy});

  Data.fromJson(Map<String, dynamic> json) {
    idTranskripNilai = json['id_transkrip_nilai'];
    idMk = json['id_mk'];
    kodeMk = json['kode_mk'];
    nmMk = json['nm_mk'];
    sks = json['sks'];
    smt = json['smt'];
    nilaiAkhirUts = json['nilai_akhir_uts'];
    nilaiHurufUts = json['nilai_huruf_uts'];
    nilaiIndeksUts = json['nilai_indeks_uts'];
    nilaiAkhirUas = json['nilai_akhir_uas'];
    nilaiAkhir = json['nilai_akhir'];
    nilaiHurufAkhir = json['nilai_huruf_akhir'];
    nilaiIndeksAkhir = json['nilai_indeks_akhir'];
    statusNilaiAkhir = json['status_nilai_akhir'];
    statusNilaiUts = json['status_nilai_uts'];
    updatedBy = json['updated_by'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['id_transkrip_nilai'] = this.idTranskripNilai;
    data['id_mk'] = this.idMk;
    data['kode_mk'] = this.kodeMk;
    data['nm_mk'] = this.nmMk;
    data['sks'] = this.sks;
    data['smt'] = this.smt;
    data['nilai_akhir_uts'] = this.nilaiAkhirUts;
    data['nilai_huruf_uts'] = this.nilaiHurufUts;
    data['nilai_indeks_uts'] = this.nilaiIndeksUts;
    data['nilai_akhir_uas'] = this.nilaiAkhirUas;
    data['nilai_akhir'] = this.nilaiAkhir;
    data['nilai_huruf_akhir'] = this.nilaiHurufAkhir;
    data['nilai_indeks_akhir'] = this.nilaiIndeksAkhir;
    data['status_nilai_akhir'] = this.statusNilaiAkhir;
    data['status_nilai_uts'] = this.statusNilaiUts;
    data['updated_by'] = this.updatedBy;
    return data;
  }
}

API调用代码

Future<NilaiMahasiswa> getNilaiMahasiswa(int semester) async {
    String url = Constant.baseURL;
    String token = await UtilSharedPreferences.getToken();
    final response = await http.get(
      Uri.parse(
        '$url/auth/mhs_siakad/transkrip_nilai?semester=$semester',
      ),
      headers: {
        'Authorization': 'Bearer $token',
      },
    );

    print(response.statusCode);
    print(response.body);
    if (response.statusCode == 200) {
      return NilaiMahasiswa.fromJson(jsonDecode(response.body));
    } else {
      throw Exception();
    }
  }

问题分析及解决方案

  1. 核心错误原因:模型类中nilaiIndeksUts和nilaiIndeksAkhir被定义为String?类型,但数值加法运算只能针对数字类型,直接操作字符串会触发类型错误。另外当前代码用固定值0和1求和,未使用API返回的实际数据,属于测试代码疏漏。

  2. 修复步骤:

    • 方案一:修改模型类型(推荐)
      如果API返回的这两个字段是纯数字格式(如"4.0"、"3.5"),直接将模型字段类型改为double?,并在fromJson中完成转换:

      // 修改Data类中的字段定义
      double? nilaiIndeksUts;
      double? nilaiIndeksAkhir;
      
      // 对应fromJson方法修改
      nilaiIndeksUts = json['nilai_indeks_uts'] != null ? double.parse(json['nilai_indeks_uts']) : null;
      nilaiIndeksAkhir = json['nilai_indeks_akhir'] != null ? double.parse(json['nilai_indeks_akhir']) : null;
      

      之后求和逻辑即可直接使用字段值:

      var nilaiIndeksUts = data[index].nilaiIndeksUts ?? 0;
      var nilaiIndeksAkhir = data[index].nilaiIndeksAkhir ?? 0;
      var result = nilaiIndeksUts + nilaiIndeksAkhir;
      
    • 方案二:求和时临时转换类型
      若不想修改模型,可在求和逻辑中先将字符串转为数字,同时处理空值避免报错:

      itemBuilder: (context, index) {
        double nilaiIndeksUts = double.tryParse(data[index].nilaiIndeksUts ?? '') ?? 0;
        double nilaiIndeksAkhir = double.tryParse(data[index].nilaiIndeksAkhir ?? '') ?? 0;
        double result = nilaiIndeksUts + nilaiIndeksAkhir;
        // ... 后续代码不变
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:41:44