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

如何修复Flutter中LayoutBuilder抛出的IndexError?

修复Flutter中PaginatedDataTable引发的IndexError

错误根源

错误日志显示RangeError (index): Index out of range: no indices are valid: 0,触发点在MyData类的getRow方法中访问list[index]时。问题出在你的StreamBuilder仅判断了snapshot.data == null,但当snapshot.data是空列表时,PaginatedDataTable仍会被渲染:此时MyData的rowCount返回0,但组件内部仍会尝试调用getRow(0),导致访问空列表的索引0触发越界错误。


修复方案

方案一:在StreamBuilder中拦截空列表(推荐)

在构建PaginatedDataTable前,同时判断数据是否为null或空列表,此时返回空状态占位Widget:

StreamBuilder<List<Model>>(
  stream: stream,
  builder: (context, snapshot) {
    // 新增空列表判断
    if (snapshot.data == null || snapshot.data!.isEmpty) {
      return Center(child: Text("暂无数据")); // 可替换为自定义空状态UI
    }
    return PaginatedDataTable(
      source: MyData(list: snapshot.data!),
      columns: [
        DataColumn(
          label: Text(
            "Name",
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
          ),
        ),
        DataColumn(
          label: Text(
            "Email",
            maxLines: 1,
            overflow: TextOverflow.ellipsis,
          ),
        ),
      ],
      columnSpacing: 20,
      horizontalMargin: 10,
      rowsPerPage: 10,
      showCheckboxColumn: false,
    );
  },
),

方案二:在DataTableSource中添加索引校验(兜底)

在MyData的getRow方法中增加索引合法性判断,避免越界访问:

class MyData extends DataTableSource {
  MyData({required this.list}) : super();
  final List<Model> list;

  @override
  bool get isRowCountApproximate => false;
  @override
  int get rowCount => list.length;
  @override
  int get selectedRowCount => 0;
  @override
  DataRow getRow(int index) {
    // 新增索引合法性校验
    if (index < 0 || index >= list.length) {
      return DataRow(cells: [DataCell(Text("")), DataCell(Text(""))]);
    }
    return DataRow(
      cells: [
        DataCell(Text(list[index].name)),
        DataCell(Text(list[index].email)),
      ],
    );
  }
}

内容的提问来源于stack exchange,提问作者My Car

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:45:37