Skip to content

Commit

Permalink
Fix draggable scrollable sheet scroll notification (flutter#45083)
Browse files Browse the repository at this point in the history
  • Loading branch information
itome authored and dnfield committed Nov 23, 2019
1 parent 5fb790e commit a3eeb51
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,8 @@ class _DraggableScrollableSheetScrollPosition
velocity = ballisticController.velocity + (physics.tolerance.velocity * ballisticController.velocity.sign);
super.goBallistic(velocity);
ballisticController.stop();
} else if (ballisticController.isCompleted) {
super.goBallistic(0);
}
}

Expand Down
64 changes: 56 additions & 8 deletions packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ void main() {
double minChildSize = .25,
double itemExtent,
Key containerKey,
NotificationListenerCallback<ScrollNotification> onScrollNotification,
}) {
return Directionality(
textDirection: TextDirection.ltr,
Expand All @@ -29,14 +30,17 @@ void main() {
minChildSize: minChildSize,
initialChildSize: initialChildSize,
builder: (BuildContext context, ScrollController scrollController) {
return Container(
key: containerKey,
color: const Color(0xFFABCDEF),
child: ListView.builder(
controller: scrollController,
itemExtent: itemExtent,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) => Text('Item $index'),
return NotificationListener<ScrollNotification>(
onNotification: onScrollNotification,
child: Container(
key: containerKey,
color: const Color(0xFFABCDEF),
child: ListView.builder(
controller: scrollController,
itemExtent: itemExtent,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) => Text('Item $index'),
),
),
);
},
Expand Down Expand Up @@ -260,5 +264,49 @@ void main() {

debugDefaultTargetPlatformOverride = null;
});

testWidgets('ScrollNotification correctly dispatched when flung without covering its container', (WidgetTester tester) async {
final List<Type> notificationTypes = <Type>[];
await tester.pumpWidget(_boilerplate(
null,
onScrollNotification: (ScrollNotification notification) {
notificationTypes.add(notification.runtimeType);
return false;
},
));

await tester.fling(find.text('Item 1'), const Offset(0, -200), 200);
await tester.pumpAndSettle();

// TODO(itome): Make sure UserScrollNotification and ScrollUpdateNotification are called correctly.
final List<Type> types = <Type>[
ScrollStartNotification,
ScrollEndNotification,
];
expect(notificationTypes, equals(types));
});

testWidgets('ScrollNotification correctly dispatched when flung with contents scroll', (WidgetTester tester) async {
final List<Type> notificationTypes = <Type>[];
await tester.pumpWidget(_boilerplate(
null,
onScrollNotification: (ScrollNotification notification) {
notificationTypes.add(notification.runtimeType);
return false;
},
));

await tester.flingFrom(const Offset(0, 325), const Offset(0, -325), 200);
await tester.pumpAndSettle();

final List<Type> types = <Type>[
ScrollStartNotification,
UserScrollNotification,
...List<Type>.filled(5, ScrollUpdateNotification),
ScrollEndNotification,
UserScrollNotification,
];
expect(notificationTypes, types);
});
}
}

0 comments on commit a3eeb51

Please sign in to comment.