Flutter:如何用Switch Case替代Future<double>方法的If-Else并简化代码?
问题解决与分析
1. 用switch case替换if-else分支
Dart的switch仅支持离散值判断,因此我们可以先将pendingHours转换为对应的整数步长,再用switch处理:
static Future<double> getMiningLeftHoursProgress(hours) async { double miningProgressValue = 0.0; String strDigits(int n) => n.toString().padLeft(2, '0'); double pendingHours = 24.0 - double.parse(strDigits(hours)); // 将区间转换为0-9的整数步长 int step = (pendingHours / 2.4).floor(); // 限制步长范围,避免超出区间 step = step.clamp(0, 9); switch (step) { case 0: miningProgressValue = 0.1; break; case 1: miningProgressValue = 0.2; break; case 2: miningProgressValue = 0.3; break; case 3: miningProgressValue = 0.4; break; case 4: miningProgressValue = 0.5; break; case 5: miningProgressValue = 0.6; break; case 6: miningProgressValue = 0.7; break; case 7: miningProgressValue = 0.8; break; case 8: miningProgressValue = 0.9; break; case 9: miningProgressValue = 1.0; break; } return miningProgressValue; }
2. if-else与switch case的适用场景及优劣对比
if-else
- 适用场景:处理范围判断、多条件组合判断(如
x > 5 && y < 10)、非离散值逻辑; - 优势:逻辑灵活,能覆盖所有复杂判断场景;
- 劣势:多层嵌套时可读性差,条件分支较多时,需要逐个判断,效率略低。
switch case
- 适用场景:单一变量的离散值判断(整数、枚举、字符串等固定值);
- 优势:结构清晰,分支一目了然,编译器可针对性优化执行效率;
- 劣势:无法直接处理范围或多条件组合,必须先将判断逻辑转换为离散值,分支值必须是常量。
3. 简化固定区间判断的代码
由于区间是固定步长(2.4递增),对应值也是固定步长(0.1递增),可以直接通过数学计算替代所有分支判断,代码大幅简化:
static Future<double> getMiningLeftHoursProgress(hours) async { String strDigits(int n) => n.toString().padLeft(2, '0'); double pendingHours = 24.0 - double.parse(strDigits(hours)); // 计算步长并限制范围,直接推导对应值 int step = (pendingHours / 2.4).floor().clamp(0, 9); return 0.1 * (step + 1); }
说明:
(pendingHours / 2.4).floor()将区间转换为0-9的整数步长,对应原代码的10个区间;clamp(0,9)确保步长不会超出有效范围(比如pendingHours为24时,计算得10,被限制为9);- 最终值通过
0.1*(step+1)直接计算,完全匹配原分支的赋值逻辑。
内容的提问来源于stack exchange,提问作者wolfsoft Developer
相关产品推荐
相关产品推荐

