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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:40:37