Flutter中Text组件无法显示计算类返回结果的求助
问题排查与修复
核心问题分析
- 计算逻辑完全未触发:
calculateOptiTijd方法中,每次循环都会重新初始化j = []并仅添加单个元素,导致j.length始终为1。传入的uren值为2或7时,j.length > uren-1的条件永远不成立(1>1、1>6均为false),内部计算代码从未执行,返回的optiTijdStart和optiTijdEind始终是空字符串,Text组件自然无内容。 - 循环范围可能无效:如果
HourlyResults的长度小于等于24,i < HourlyResults.length -24的条件不成立,循环直接跳过,直接返回空值。 - 索引越界风险:当
i从0开始时,i-7为负数,访问HourlyResults[i-7]会触发数组越界异常(若循环执行的话)。
修复方案
1. 修正数据收集逻辑
改为收集连续uren个小时的结果到j列表中,而非每次仅添加一个元素。
2. 调整循环范围
将循环上限改为HourlyResults.length - uren,确保能取到连续的uren个元素,避免越界。
3. 初始化默认值
给返回的字符串设置默认值,方便排查未触发计算的情况。
4. 添加调试输出
在关键位置添加打印,确认逻辑是否正常执行。
修改后的代码
class OptiTijdCalculator { List<String> calculateOptiTijd(double uren) { // 设置默认值,避免空字符串导致Text无显示 String optiTijdStart = "0"; String optiTijdEind = "0"; int hourCount = uren.toInt(); // 小时数转为整数处理 // 调整循环范围,确保能取到连续hourCount个元素 for (int i = 0; i <= HourlyResults.length - hourCount; i++) { List<double> j = []; // 收集连续hourCount个小时的结果 for (int k = 0; k < hourCount; k++) { j.add(HourlyResults[i + k].result); } // 确保j列表有足够数据再执行计算 if (j.length >= hourCount) { double sum1 = j.reduce((a, b) => a + b); // 滑动窗口,取下一组连续hourCount个元素 List<double> j2 = []; for (int k = 1; k <= hourCount; k++) { if (i + k < HourlyResults.length) { j2.add(HourlyResults[i + k].result); } } if (j2.length >= hourCount) { double sum2 = j2.reduce((a, b) => a + b); // 增加索引判断,避免负数越界 if (sum1 > sum2) { if (i >=7) { optiTijdStart = HourlyResults[i -7].dateTime.hour.toString(); optiTijdEind = HourlyResults[i + hourCount -1].dateTime.hour.toString(); } } else { if (i >=6) { optiTijdStart = HourlyResults[i -6].dateTime.hour.toString(); optiTijdEind = HourlyResults[i + hourCount].dateTime.hour.toString(); } } // 调试打印,确认计算是否触发 print("计算结果:start=$optiTijdStart, end=$optiTijdEind"); } } } return [optiTijdStart, optiTijdEind]; } } // WhiteContainersRowOne组件保持原代码不变 class WhiteContainersRowOne extends StatelessWidget { const WhiteContainersRowOne({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final double screenWidth = MediaQuery.of(context).size.width; final double screenHeight = MediaQuery.of(context).size.height; OptiTijdCalculator calculator = OptiTijdCalculator(); double urenContainer1 = 2; // Container 1的小时数设置 double urenContainer2 = 7; // Container 2的小时数设置 List<String> resultContainer1 = calculator.calculateOptiTijd(urenContainer1); List<String> resultContainer2 = calculator.calculateOptiTijd(urenContainer2); return SizedBox( width: screenWidth * 0.9, height: screenWidth * 0.4, child: Row( children: [ Container( height: screenHeight * 0.30, width: screenWidth * 0.42, decoration: BoxDecoration( borderRadius: BorderRadius.circular(7.0), color: const Color.fromARGB(255, 255, 255, 255), ), child: Center( child: Column( children: [ SizedBox(height: screenWidth * 0.05), Icon( Icons.local_laundry_service, size: (screenWidth * 0.17), ), SizedBox(height: screenWidth * 0.02), Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Van ", style: TextStyle( fontSize: 14, ), ), Text( resultContainer1[0], style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), ], ), const Divider( thickness: 2, indent: 48, endIndent: 48, color: Colors.black, height: 10, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( "Tot ", style: TextStyle( fontSize: 14, ), ), Text( resultContainer1[1], style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), ], ), ], ), ], ), ), ), SizedBox( width: screenWidth * 0.06, ), Container( height: screenWidth * 0.42, width: screenWidth * 0.42, decoration: BoxDecoration( borderRadius: BorderRadius.circular(7.0), color: const Color.fromARGB(255, 255, 255, 255), ), child: Center( child: Column( children: [ SizedBox(height: screenWidth * 0.05), Icon( Icons.electric_car, size: (screenWidth * 0.14), ), SizedBox(height: screenWidth * 0.05), Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( "Van ", style: TextStyle( fontSize: 14, ), ), Text( resultContainer2[0], style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), ], ), const Divider( thickness: 2, indent: 48, endIndent: 48, color: Colors.black, height: 10, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( "Tot ", style: TextStyle( fontSize: 14, ), ), Text( resultContainer2[1], style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), ], ), ], ), ], ), ), ), ], ), ); } }
内容的提问来源于stack exchange,提问作者Koen
相关产品推荐
相关产品推荐

