@@ -560,6 +560,8 @@ void main() {
560560 GlobalKey nestedScrollViewKey = GlobalKey ();
561561 NestedScrollUtil ? nestedScrollUtil;
562562 Map <BuildContext , ObserveModel > resultMap = {};
563+ int sliverListItemCount = 30 ;
564+ int sliverGridItemCount = 150 ;
563565
564566 Widget _buildSliverGridView () {
565567 return SliverGrid (
@@ -582,7 +584,7 @@ void main() {
582584 ),
583585 );
584586 },
585- childCount: 150 ,
587+ childCount: sliverGridItemCount ,
586588 ),
587589 );
588590 }
@@ -606,7 +608,7 @@ void main() {
606608 ),
607609 );
608610 },
609- childCount: 30 ,
611+ childCount: sliverListItemCount ,
610612 ),
611613 );
612614 }
@@ -673,7 +675,12 @@ void main() {
673675 );
674676 }
675677
676- Widget resetAll () {
678+ Widget resetAll ({
679+ int listItemCount = 30 ,
680+ int gridItemCount = 150 ,
681+ }) {
682+ sliverListItemCount = listItemCount;
683+ sliverGridItemCount = gridItemCount;
677684 resultMap = {};
678685 nestedScrollUtil = NestedScrollUtil ();
679686 outerScrollController = ScrollController ();
@@ -956,6 +963,165 @@ void main() {
956963 );
957964 },
958965 );
966+
967+ testWidgets ('Check animateTo Future completion' , (tester) async {
968+ resetAll ();
969+ await tester.pumpWidget (widget);
970+
971+ bool isFutureCompleted = false ;
972+ const Duration duration = Duration (seconds: 2 );
973+
974+ // Start to scroll
975+ Future future = nestedScrollUtil! .animateTo (
976+ nestedScrollViewKey: nestedScrollViewKey,
977+ observerController: observerController,
978+ sliverContext: _sliverBodyListCtx,
979+ position: NestedScrollUtilPosition .body,
980+ index: 5 ,
981+ duration: duration,
982+ curve: Curves .linear,
983+ );
984+
985+ future.whenComplete (() {
986+ isFutureCompleted = true ;
987+ });
988+
989+ // Wait for scroll to start
990+ await tester.pump ();
991+
992+ // Verify scroll hasn't completed
993+ expect (isFutureCompleted, false );
994+
995+ // Wait for scroll to complete
996+ const intervalDuration = Duration (milliseconds: 100 );
997+ int intervalTime = 0 ;
998+ while (tester.binding.hasScheduledFrame) {
999+ await tester.pump (intervalDuration);
1000+ intervalTime++ ;
1001+ }
1002+ // Make sure the scroll executes and completes correctly.
1003+ expect (
1004+ intervalTime,
1005+ greaterThanOrEqualTo (
1006+ duration.inMilliseconds ~ / intervalDuration.inMilliseconds,
1007+ ),
1008+ );
1009+ expect (isFutureCompleted, true );
1010+
1011+ // Scroll back to index 0
1012+ isFutureCompleted = false ;
1013+ intervalTime = 0 ;
1014+ future = nestedScrollUtil! .animateTo (
1015+ nestedScrollViewKey: nestedScrollViewKey,
1016+ observerController: observerController,
1017+ sliverContext: _sliverBodyListCtx,
1018+ position: NestedScrollUtilPosition .body,
1019+ index: 0 ,
1020+ duration: duration,
1021+ curve: Curves .easeInOut,
1022+ );
1023+
1024+ future.whenComplete (() {
1025+ isFutureCompleted = true ;
1026+ });
1027+
1028+ // Wait for scroll to start
1029+ await tester.pump ();
1030+
1031+ // Verify scroll hasn't completed
1032+ expect (isFutureCompleted, false );
1033+
1034+ // Wait for scroll to complete
1035+ while (tester.binding.hasScheduledFrame) {
1036+ await tester.pump (intervalDuration);
1037+ intervalTime++ ;
1038+ }
1039+ // Make sure the scroll executes and completes correctly.
1040+ expect (
1041+ intervalTime,
1042+ greaterThanOrEqualTo (
1043+ duration.inMilliseconds ~ / intervalDuration.inMilliseconds,
1044+ ),
1045+ );
1046+ expect (isFutureCompleted, true );
1047+ });
1048+
1049+ testWidgets ('Check jumpTo Future completion' , (tester) async {
1050+ int listItemCount = 100 ;
1051+ resetAll (
1052+ listItemCount: listItemCount,
1053+ );
1054+ await tester.pumpWidget (widget);
1055+
1056+ bool isFutureCompleted = false ;
1057+
1058+ // Start to scroll
1059+ Future future = nestedScrollUtil! .jumpTo (
1060+ nestedScrollViewKey: nestedScrollViewKey,
1061+ observerController: observerController,
1062+ sliverContext: _sliverBodyListCtx,
1063+ position: NestedScrollUtilPosition .body,
1064+ // Need to use an unrendered item's index to force paging to find it.
1065+ index: listItemCount - 1 ,
1066+ );
1067+
1068+ future.whenComplete (() {
1069+ isFutureCompleted = true ;
1070+ });
1071+
1072+ // Wait for scroll to start
1073+ await tester.pump ();
1074+
1075+ // Verify scroll hasn't completed
1076+ expect (isFutureCompleted, false );
1077+
1078+ // Wait for scroll to complete
1079+ const intervalDuration = Duration (milliseconds: 100 );
1080+ int intervalTime = 0 ;
1081+ while (tester.binding.hasScheduledFrame) {
1082+ await tester.pump (intervalDuration);
1083+ intervalTime++ ;
1084+ }
1085+ // Make sure the scroll executes and completes correctly.
1086+ expect (
1087+ intervalTime,
1088+ greaterThanOrEqualTo (0 ),
1089+ );
1090+ expect (isFutureCompleted, true );
1091+
1092+ // Scroll back to index 0
1093+ isFutureCompleted = false ;
1094+ intervalTime = 0 ;
1095+ future = nestedScrollUtil! .jumpTo (
1096+ nestedScrollViewKey: nestedScrollViewKey,
1097+ observerController: observerController,
1098+ sliverContext: _sliverBodyListCtx,
1099+ position: NestedScrollUtilPosition .body,
1100+ index: 0 ,
1101+ );
1102+
1103+ future.whenComplete (() {
1104+ isFutureCompleted = true ;
1105+ });
1106+
1107+ // Wait for scroll to start
1108+ await tester.pump ();
1109+
1110+ // Verify scroll hasn't completed
1111+ expect (isFutureCompleted, false );
1112+
1113+ // Wait for scroll to complete
1114+ while (tester.binding.hasScheduledFrame) {
1115+ await tester.pump (intervalDuration);
1116+ intervalTime++ ;
1117+ }
1118+ // Make sure the scroll executes and completes correctly.
1119+ expect (
1120+ intervalTime,
1121+ greaterThanOrEqualTo (0 ),
1122+ );
1123+ expect (isFutureCompleted, true );
1124+ });
9591125 },
9601126 );
9611127
0 commit comments