如何判断列表中ShiftName是否为空,非空则在前端展示
问题解决:正确获取并展示非空ShiftName
问题分析
当前代码的核心错误在于传递shiftName时,错误复用了外层ListView.builder的索引i来访问内层Wages列表:
shiftName: wageAccountsData[i].wages![i].shiftName!.isEmpty ? "":wageAccountsData[i].wages![i].shiftName,
外层的i是账户数据列表的索引(示例中仅1条数据,i=0),而内层Wages是独立的子列表,用同一个i只能固定访问子列表的第i项,无法遍历找到所有非空的ShiftName。此外,直接使用!强制解空会增加空指针风险。
解决方案
遍历当前账户的Wages列表,筛选出第一个非空的ShiftName,如果没有则返回空字符串。利用Dart集合的firstWhere方法可以高效实现这个逻辑,同时处理空安全。
修改后的关键代码片段
替换WageAccountsCard的shiftName参数赋值:
shiftName: wageAccountsData[i].wages?.firstWhere( (wage) => wage.shiftName?.isNotEmpty ?? false, orElse: () => Wages(shiftName: "") ).shiftName ?? "",
wages?.firstWhere:先判断wages是否为null,避免空指针- 条件
wage.shiftName?.isNotEmpty ?? false:判断当前Wage项的shiftName是否非空 orElse:当所有Wage项的shiftName都为空时,返回一个默认的空ShiftName对象- 最后用
?? ""处理可能的空值,确保最终返回字符串类型
完整修改后的Consumer代码
Consumer<EmployeeWageAccountsProvider>( builder: (context, data, child) { if (!data.isLoading) { int length = data.getEmployeeAccountsData!.length; if (data.getEmployeeAccountsData!.isNotEmpty) { wageAccountsData = data.getEmployeeAccountsData!; return ListView.builder( itemCount: length, shrinkWrap: true, scrollDirection: Axis.vertical, itemBuilder: (context, i) { return WageAccountsCard( date: Helper.formatStringDate(wageAccountsData[i].date!), shiftName: wageAccountsData[i].wages?.firstWhere( (wage) => wage.shiftName?.isNotEmpty ?? false, orElse: () => Wages(shiftName: "") ).shiftName ?? "", wages: wageAccountsData[i].wages, ); }, ); } return noDataFound(context, 50); } return const WageAccountsShimmer(); }),
额外优化(可选)
如果需要展示所有非空的ShiftName(而非仅第一个),可以用where筛选后拼接:
shiftName: wageAccountsData[i].wages ?.where((w) => w.shiftName?.isNotEmpty ?? false) .map((w) => w.shiftName) .join(", ") ?? "",
内容的提问来源于stack exchange,提问作者Arslan
相关产品推荐
相关产品推荐

