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(); } }
问题分析及解决方案
核心错误原因:模型类中
nilaiIndeksUts和nilaiIndeksAkhir被定义为String?类型,但数值加法运算只能针对数字类型,直接操作字符串会触发类型错误。另外当前代码用固定值0和1求和,未使用API返回的实际数据,属于测试代码疏漏。修复步骤:
方案一:修改模型类型(推荐)
如果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
相关产品推荐
相关产品推荐

