Fix `DataTable` `_SortArrow` changing orientation when state is updated (#94455)
diff --git a/packages/flutter/lib/src/material/data_table.dart b/packages/flutter/lib/src/material/data_table.dart
index 9fb0dc6..f8972c3 100644
--- a/packages/flutter/lib/src/material/data_table.dart
+++ b/packages/flutter/lib/src/material/data_table.dart
@@ -1139,6 +1139,7 @@
@override
void initState() {
super.initState();
+ _up = widget.up;
_opacityAnimation = CurvedAnimation(
parent: _opacityController = AnimationController(
duration: widget.duration,
diff --git a/packages/flutter/test/material/data_table_test.dart b/packages/flutter/test/material/data_table_test.dart
index aa781ff..1381a68 100644
--- a/packages/flutter/test/material/data_table_test.dart
+++ b/packages/flutter/test/material/data_table_test.dart
@@ -486,6 +486,105 @@
);
});
+ testWidgets('DataTable sort indicator orientation does not change on state update', (WidgetTester tester) async {
+ // Regression test for https://github.com/flutter/flutter/issues/43724
+ Widget buildTable({String title = 'Name1'}) {
+ return DataTable(
+ sortColumnIndex: 0,
+ columns: <DataColumn>[
+ DataColumn(
+ label: Text(title),
+ tooltip: 'Name',
+ onSort: (int columnIndex, bool ascending) {},
+ ),
+ ],
+ rows: kDesserts.map<DataRow>((Dessert dessert) {
+ return DataRow(
+ cells: <DataCell>[
+ DataCell(
+ Text(dessert.name),
+ ),
+ ],
+ );
+ }).toList(),
+ );
+ }
+
+ // Check for ascending list
+ await tester.pumpWidget(MaterialApp(
+ home: Material(child: buildTable()),
+ ));
+ // The `tester.widget` ensures that there is exactly one upward arrow.
+ final Finder iconFinder = find.widgetWithIcon(Transform, Icons.arrow_upward);
+ Transform transformOfArrow = tester.widget<Transform>(iconFinder);
+ expect(
+ transformOfArrow.transform.getRotation(),
+ equals(Matrix3.identity()),
+ );
+
+ // Cause a rebuild by updating the widget
+ await tester.pumpWidget(MaterialApp(
+ home: Material(child: buildTable(title: 'Name2')),
+ ));
+ await tester.pumpAndSettle();
+ // The `tester.widget` ensures that there is exactly one upward arrow.
+ transformOfArrow = tester.widget<Transform>(iconFinder);
+ expect(
+ transformOfArrow.transform.getRotation(),
+ equals(Matrix3.identity()), // Should not have changed
+ );
+ });
+
+ testWidgets('DataTable sort indicator orientation does not change on state update - reverse', (WidgetTester tester) async {
+ // Regression test for https://github.com/flutter/flutter/issues/43724
+ Widget buildTable({String title = 'Name1'}) {
+ return DataTable(
+ sortColumnIndex: 0,
+ sortAscending: false,
+ columns: <DataColumn>[
+ DataColumn(
+ label: Text(title),
+ tooltip: 'Name',
+ onSort: (int columnIndex, bool ascending) {},
+ ),
+ ],
+ rows: kDesserts.map<DataRow>((Dessert dessert) {
+ return DataRow(
+ cells: <DataCell>[
+ DataCell(
+ Text(dessert.name),
+ ),
+ ],
+ );
+ }).toList(),
+ );
+ }
+
+ // Check for ascending list
+ await tester.pumpWidget(MaterialApp(
+ home: Material(child: buildTable()),
+ ));
+ // The `tester.widget` ensures that there is exactly one upward arrow.
+ final Finder iconFinder = find.widgetWithIcon(Transform, Icons.arrow_upward);
+ Transform transformOfArrow = tester.widget<Transform>(iconFinder);
+ expect(
+ transformOfArrow.transform.getRotation(),
+ equals(Matrix3.rotationZ(math.pi)),
+ );
+
+ // Cause a rebuild by updating the widget
+ await tester.pumpWidget(MaterialApp(
+ home: Material(child: buildTable(title: 'Name2')),
+ ));
+ await tester.pumpAndSettle();
+ // The `tester.widget` ensures that there is exactly one upward arrow.
+ transformOfArrow = tester.widget<Transform>(iconFinder);
+ expect(
+ transformOfArrow.transform.getRotation(),
+ equals(Matrix3.rotationZ(math.pi)), // Should not have changed
+ );
+ });
+
testWidgets('DataTable row onSelectChanged test', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(