diff --git a/packages/flutter/lib/src/material/data_table.dart b/packages/flutter/lib/src/material/data_table.dart index 685f25f2d0d..d9b06fe96a0 100644 --- a/packages/flutter/lib/src/material/data_table.dart +++ b/packages/flutter/lib/src/material/data_table.dart @@ -868,9 +868,10 @@ class DataTable extends StatelessWidget { ); final bool anyRowSelectable = rows.any((DataRow row) => row.onSelectChanged != null); final bool displayCheckboxColumn = showCheckboxColumn && anyRowSelectable; - final Iterable rowsChecked = displayCheckboxColumn ? - rows.where((DataRow row) => row.onSelectChanged != null && row.selected) : []; - final bool allChecked = displayCheckboxColumn && rowsChecked.length == rows.length; + final Iterable rowsWithCheckbox = displayCheckboxColumn ? + rows.where((DataRow row) => row.onSelectChanged != null) : []; + final Iterable rowsChecked = rowsWithCheckbox.where((DataRow row) => row.selected); + final bool allChecked = displayCheckboxColumn && rowsChecked.length == rowsWithCheckbox.length; final bool anyChecked = displayCheckboxColumn && rowsChecked.isNotEmpty; final bool someChecked = anyChecked && !allChecked; final double effectiveHorizontalMargin = horizontalMargin diff --git a/packages/flutter/test/material/data_table_test.dart b/packages/flutter/test/material/data_table_test.dart index f4c1c892a95..1c8bd836256 100644 --- a/packages/flutter/test/material/data_table_test.dart +++ b/packages/flutter/test/material/data_table_test.dart @@ -107,7 +107,7 @@ void main() { testWidgets('DataTable control test - tristate', (WidgetTester tester) async { final List log = []; const int numItems = 3; - Widget buildTable(List selected) { + Widget buildTable(List selected, {int? disabledIndex}) { return DataTable( onSelectAll: (bool? value) { log.add('select-all: $value'); @@ -123,7 +123,7 @@ void main() { (int index) => DataRow( cells: [DataCell(Text('Row $index'))], selected: selected[index], - onSelectChanged: (bool? value) { + onSelectChanged: index == disabledIndex ? null : (bool? value) { log.add('row-selected: $index'); }, ), @@ -157,6 +157,21 @@ void main() { expect(log, ['select-all: false']); log.clear(); + + // Tapping the parent checkbox when all rows are selected and one is + // disabled, deselects all. + await tester.pumpWidget(MaterialApp( + home: Material( + child: buildTable( + [true, true, false], + disabledIndex: 2, + ), + ), + )); + await tester.tap(find.byType(Checkbox).first); + + expect(log, ['select-all: false']); + log.clear(); }); testWidgets('DataTable control test - no checkboxes', (WidgetTester tester) async {