Flutter中如何对API返回数据执行加减乘除等计算?
API返回数据的运算实现示例
核心逻辑:API返回的NilaiMahasiswa对象与本地变量的运算规则完全一致,只需先从对象中提取目标字段,确保字段为数值类型(int/double)(若API返回字符串格式的数值,需先完成类型转换)。
先假设你的模型结构(基于常见成绩单场景)
如果你的NilaiMahasiswa和课程模型尚未定义,参考以下结构(需与API返回字段对应):
class NilaiMahasiswa { final List<Matakuliah> matakuliah; // 可添加其他返回字段,如semester、nim等 NilaiMahasiswa({required this.matakuliah}); factory NilaiMahasiswa.fromJson(Map<String, dynamic> json) { return NilaiMahasiswa( matakuliah: List<Matakuliah>.from( json['matakuliah'].map((x) => Matakuliah.fromJson(x)), ), ); } } class Matakuliah { final int sks; final double nilai; final String namaMatkul; Matakuliah({required this.sks, required this.nilai, required this.namaMatkul}); factory Matakuliah.fromJson(Map<String, dynamic> json) { return Matakuliah( sks: json['sks'], // 若API返回的是字符串格式的数值,需用double.parse转换 nilai: double.parse(json['nilai'].toString()), namaMatkul: json['nama_matkul'], ); } }
1. 基础运算示例(单个/少量字段)
调用API获取数据后,直接提取字段执行加减乘除:
void main() async { // 调用API获取指定学期成绩 NilaiMahasiswa nilaiData = await getNilaiMahasiswa(3); // 确保课程列表不为空 if (nilaiData.matakuliah.isNotEmpty) { Matakuliah firstMatkul = nilaiData.matakuliah.first; // 乘法:成绩 × 学分(计算单门课加权分) double weightedScore = firstMatkul.nilai * firstMatkul.sks; print("第一门课加权分:$weightedScore"); // 除法:成绩 ÷ 100(转换为百分比系数) double scoreRatio = firstMatkul.nilai / 100; print("第一门课成绩系数:$scoreRatio"); // 加法:前两门课成绩求和 if (nilaiData.matakuliah.length >= 2) { double totalTwoScores = firstMatkul.nilai + nilaiData.matakuliah[1].nilai; print("前两门课成绩总和:$totalTwoScores"); } } }
2. 批量运算示例(统计全学期数据)
比如计算总学分、学期加权平均分(常见成绩单需求):
Future<void> calculateSemesterStats() async { NilaiMahasiswa nilaiData = await getNilaiMahasiswa(3); int totalSks = 0; double totalWeightedScore = 0; // 遍历所有课程,累加学分和加权分 for (var matkul in nilaiData.matakuliah) { totalSks += matkul.sks; // 加法:累加总学分 totalWeightedScore += matkul.nilai * matkul.sks; // 乘法+加法:累加加权分 } // 除法:计算加权平均分 double ipSemester = totalWeightedScore / totalSks; print("总学分:$totalSks"); print("学期绩点:${ipSemester.toStringAsFixed(2)}"); // 保留两位小数 }
3. 处理API返回的字母成绩(如A/B/C)
如果API返回的是字母等级而非数字,需先映射为数值再运算:
// 修改Matakuliah的fromJson方法,添加字母转数值逻辑 factory Matakuliah.fromJson(Map<String, dynamic> json) { double nilai; String nilaiStr = json['nilai'].toString().toUpperCase(); // 字母成绩转绩点(示例规则,可根据实际调整) switch(nilaiStr) { case "A": nilai = 4.0; break; case "B": nilai = 3.0; break; case "C": nilai = 2.0; break; case "D": nilai = 1.0; break; case "E": nilai = 0.0; break; default: // 非字母则尝试转数字,转换失败默认0.0 nilai = double.tryParse(nilaiStr) ?? 0.0; } return Matakuliah( sks: json['sks'], nilai: nilai, namaMatkul: json['nama_matkul'], ); }
内容的提问来源于stack exchange,提问作者sharon
相关产品推荐
相关产品推荐

