@@ -398,6 +398,7 @@ void main() {
398398 expect (find.text ('Rows per page:' ), findsOneWidget);
399399 expect (tester.getTopLeft (find.text ('Rows per page:' )).dx, 18.0 ); // 14 padding in the footer row, 4 padding from the card
400400 });
401+
401402 testWidgets ('PaginatedDataTable custom row height' , (WidgetTester tester) async {
402403 final TestDataSource source = TestDataSource ();
403404
@@ -1043,4 +1044,85 @@ void main() {
10431044 await tester.pumpWidget (buildFrame (overflowBar));
10441045 expect (headerX, tester.getTopLeft (find.byType (ElevatedButton )).dx);
10451046 });
1047+
1048+ testWidgets ('PaginatedDataTable can be scrolled using ScrollController' , (WidgetTester tester) async {
1049+ final TestDataSource source = TestDataSource ();
1050+ final ScrollController scrollController = ScrollController ();
1051+
1052+ Widget buildTable (TestDataSource source) {
1053+ return Align (
1054+ alignment: Alignment .topLeft,
1055+ child: SizedBox (
1056+ width: 100 ,
1057+ child: PaginatedDataTable (
1058+ controller: scrollController,
1059+ header: const Text ('Test table' ),
1060+ source: source,
1061+ rowsPerPage: 2 ,
1062+ columns: const < DataColumn > [
1063+ DataColumn (
1064+ label: Text ('Name' ),
1065+ tooltip: 'Name' ,
1066+ ),
1067+ DataColumn (
1068+ label: Text ('Calories' ),
1069+ tooltip: 'Calories' ,
1070+ numeric: true ,
1071+ ),
1072+ DataColumn (
1073+ label: Text ('Generation' ),
1074+ tooltip: 'Generation' ,
1075+ ),
1076+ ],
1077+ ),
1078+ ),
1079+ );
1080+ }
1081+
1082+ await tester.pumpWidget (MaterialApp (
1083+ home: buildTable (source),
1084+ ));
1085+
1086+ // DataTable uses provided ScrollController
1087+ final Scrollable bodyScrollView = tester.widget (find.byType (Scrollable ).first);
1088+ expect (bodyScrollView.controller, scrollController);
1089+
1090+ expect (scrollController.offset, 0.0 );
1091+ scrollController.jumpTo (50.0 );
1092+ await tester.pumpAndSettle ();
1093+
1094+ expect (scrollController.offset, 50.0 );
1095+ });
1096+
1097+ testWidgets ('PaginatedDataTable uses PrimaryScrollController when primary ' , (WidgetTester tester) async {
1098+ final ScrollController primaryScrollController = ScrollController ();
1099+ final TestDataSource source = TestDataSource ();
1100+
1101+ await tester.pumpWidget (
1102+ MaterialApp (
1103+ home: PrimaryScrollController (
1104+ controller: primaryScrollController,
1105+ child: PaginatedDataTable (
1106+ primary: true ,
1107+ header: const Text ('Test table' ),
1108+ source: source,
1109+ rowsPerPage: 2 ,
1110+ columns: const < DataColumn > [
1111+ DataColumn (label: Text ('Name' )),
1112+ DataColumn (label: Text ('Calories' ), numeric: true ),
1113+ DataColumn (label: Text ('Generation' )),
1114+ ],
1115+ ),
1116+ ),
1117+ )
1118+ );
1119+
1120+ // DataTable uses primaryScrollController
1121+ final Scrollable bodyScrollView = tester.widget (find.byType (Scrollable ).first);
1122+ expect (bodyScrollView.controller, primaryScrollController);
1123+
1124+ // Footer does not use primaryScrollController
1125+ final Scrollable footerScrollView = tester.widget (find.byType (Scrollable ).last);
1126+ expect (footerScrollView.controller, null );
1127+ });
10461128}
0 commit comments