Commit a3eeb51a authored by Takeshi Tsukamoto's avatar Takeshi Tsukamoto Committed by Dan Field

Fix draggable scrollable sheet scroll notification (#45083)

parent 5fb790e6
......@@ -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);
}
}
......
......@@ -15,6 +15,7 @@ void main() {
double minChildSize = .25,
double itemExtent,
Key containerKey,
NotificationListenerCallback<ScrollNotification> onScrollNotification,
}) {
return Directionality(
textDirection: TextDirection.ltr,
......@@ -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'),
),
),
);
},
......@@ -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);
});
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment