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

如何判断列表中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:50:37