初始化List避免潜在错误:Dart非空返回类型报错问题排查
问题成因
- 你首先误解了报错指向的作用域:该报错提示的是你传入
List.generate的内层匿名生成函数存在返回值问题,不是外层_calculateTrips函数的返回逻辑有问题。 List.generate构造函数要求传入的第二个参数(元素生成回调)必须返回和目标列表泛型匹配的元素,你当前的回调里仅执行了trips.add(counter)操作,没有显式返回任何值,Dart会默认该回调返回null,和你要生成的List<int>的非空int类型要求冲突,因此抛出该类型错误。- 你的代码逻辑同时存在对
List.generate的误用:List.generate本身就会按回调返回的元素自动生成新列表,你既给trips赋值为generate的返回值,又在回调里手动往trips添加元素,最终得到的列表长度会是预期的两倍,完全不符合需求。
修复方案
两种改法二选一即可:
改法1:正确使用List.generate,移除多余add操作
直接让生成回调返回counter作为对应索引的元素:
List<int> _calculateTrips() { return List.generate(30, (index) { var counter = 0; var aDay = DateTime.now().subtract(Duration(days: index)); for (var aWalk in walks) { if ((aDay.month == aWalk.month) && (aDay.day == aWalk.day)) { counter++; } } // 显式返回counter作为当前index位置的元素 return counter; }); }
改法2:不使用List.generate,直接循环填充空列表
List<int> _calculateTrips() { List<int> trips = []; for (int index = 0; index < 30; index++) { var counter = 0; var aDay = DateTime.now().subtract(Duration(days: index)); for (var aWalk in walks) { if ((aDay.month == aWalk.month) && (aDay.day == aWalk.day)) { counter++; } } trips.add(counter); } return trips; }
内容的提问来源于stack exchange,提问作者Al C
相关产品推荐
相关产品推荐

