Flutter使用PaginatedDataTable报BookModel无[]实例方法错误求助
报错原因
运行抛出Class 'BookModel' has no instance method '[]',是因为你对BookModel类的实例使用了Map类型的[]键值访问语法。
你的controller.books是List<BookModel>类型,列表里的每个元素都是BookModel类的实例对象,不是可通过['字段名']取值的Map结构,BookModel类本身没定义[]方法,自然会报这个错。
另外现有代码还有三个隐藏问题:一是BookModel的属性全是下划线开头的私有属性,外部无法直接访问;二是没有实现DataTableSource要求的几个必选覆写属性,后续运行也会报错;三是定义的DataColumn数量和DataCell数量不匹配,也会触发组件报错。
修复方案
- 调整BookModel类,开放属性访问:
class BookModel{ // 移除私有属性的下划线前缀,改为公开可访问 String name; String writer; String img; String price; String webSite; BookModel(this.name, this.writer, this.img, this.price, this.webSite); }
- 重写MyData类的逻辑,明确类型、修正取值方式、补全必选覆写:
class MyData extends DataTableSource { final controller = Get.find<Controller>(); // 明确指定数据类型为BookModel列表,不要用动态类型 late final List<BookModel> _data; MyData() { _data = controller.books; } @override DataRow? getRow(int index) { // 加索引边界判断,避免越界崩溃 if (index >= _data.length) return null; final currentBook = _data[index]; return DataRow( cells: [ // 直接通过对象属性取值,不要用[]的Map语法 // 注意单元格顺序要和你定义的列顺序一一对应 DataCell(Text(currentBook.webSite)), DataCell(Text(currentBook.name)), ], ); } // 补全DataTableSource必须覆写的三个属性 @override bool get isRowCountApproximate => false; @override int get rowCount => _data.length; @override int get selectedRowCount => 0; }
- 检查PaginatedDataTable的列配置,保证columns数量和每个DataRow的cells数量完全一致:
Widget bodyData() => PaginatedDataTable( source: _data, columns: const [ DataColumn(label: Text('WebSite')), DataColumn(label: Text('Book Name')), // 如果要显示作者列就加对应的DataColumn,不要留cells比columns多的情况 // DataColumn(label: Text('Writer')), ], // 其他配置比如rowsPerPage按需添加即可 );
避坑提示
- 开发时尽量给变量明确指定类型,不要用
var声明动态类型的集合,IDE可以提前帮你检出类型错误,不用等到运行才崩溃 - 自定义类的属性如果需要跨类访问,不要用下划线开头的私有命名,否则会出现访问限制
- 使用PaginatedDataTable时必须保证DataColumn数量和每一行的DataCell数量完全匹配,否则会抛出组件约束错误
内容的提问来源于stack exchange,提问作者dsfsfsdf rwrrwr
相关产品推荐
相关产品推荐

