如何修复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
相关产品推荐
相关产品推荐

