flutter/examples/api/test/widgets
Hans Muller 92f8455ff8
Scrollbar thumb drag gestures now produce one start and one end scroll notification (#146654)
The scroll notification events reported for a press-drag-release gesture within a scrollable on a touch screen device begin with a `ScrollStartNotification`, followed by a series of `ScrollUpdateNotifications`, and conclude with a `ScrollEndNotification`. This protocol can be used to defer work until an interactive scroll gesture ends. For example, you might defer updating a scrollable's contents via network requests until the scroll has ended, or you might want to automatically auto-scroll at that time. 

In the example that follows the CustomScrollView automatically scrolls so that the last partially visible fixed-height item is completely visible when the scroll gesture ends. Many iOS applications do this kind of thing. It only makes sense to auto-scroll when the user isn't actively dragging the scrollable around.

It's easy enough to do this by reacting to a ScrollEndNotifcation by auto-scrolling to align the last fixed-height list item ([source code](https://gist.github.com/HansMuller/13e2a7adadc9afb3803ba7848b20c410)).

https://github.com/flutter/flutter/assets/1377460/a6e6fc77-6742-4f98-81ba-446536535f73

Dragging the scrollbar thumb in a desktop application is a similar user gesture. Currently it's not possible to defer work or auto-scroll (or whatever) while the scrollable is actively being dragged via the scrollbar thumb because each scrollbar thumb motion is mapped to a scroll start - scroll update - scroll end series of notifications.  On a desktop platform, the same code behaves quite differently when the scrollbar thumb is dragged.

https://github.com/flutter/flutter/assets/1377460/2593d8a3-639c-407f-80c1-6e6f67fb8c5f

The stream of scroll-end events triggers auto-scrolling every time the thumb moves. From the user's perspective this feels like a losing struggle.

One can also detect the beginning and end of a touch-drag by listening to the value of a ScrollPosition's `isScrollingNotifier`. This approach suffers from a similar problem: during a scrollbar thumb-drag, the `isScrollingNotifier` value isn't updated at all.

This PR refactors the RawScrollbar implementation to effectively use a ScrollDragController to manage scrolls caused by dragging the scrollbar's thumb. Doing so means that dragging the thumb will produce the same notifications as dragging the scrollable on a touch device.

Now desktop applications can choose to respond to scrollbar thumb drags in the same that they respond to drag scrolling on a touch screen. With the changes included here, the desktop or web version of the app works as expected, whether you're listing to scroll notifications or the scroll position's `isScrollingNotifier`.

https://github.com/flutter/flutter/assets/1377460/67435c40-a866-4735-a19b-e3d68eac8139

This PR also makes the second [ScrollPosition API doc example](https://api.flutter.dev/flutter/widgets/ScrollPosition-class.html#cupertino.ScrollPosition.2) work as expected when used with the DartPad that's  part of API doc page.

Desktop applications also see scroll start-update-end notifications due to the mouse wheel.  There is no touch screen analog for the mouse wheel, so an application that wanted to enable this kind of auto-scrolling alignment would have to include a heuristic that dealt with the sequence of small scrolls triggered by the mouse wheel. Here's an example of that: [source code](https://gist.github.com/HansMuller/ce5c474a458f5f4bcc07b0d621843165). This version of the app does not auto-align in response to small changes, wether they're triggered by dragging the scrollbar thumb of the mouse wheel.

Related sliver utility PRs: https://github.com/flutter/flutter/pull/143538,  https://github.com/flutter/flutter/pull/143196, https://github.com/flutter/flutter/pull/143325.
2024-06-04 22:02:12 +00:00
..
actions Add tests for restorable_value.0.dart API example. (#148676) 2024-05-23 08:34:23 +00:00
animated_grid Add SliverAnimatedGrid and AnimatedGrid (#112982) 2022-10-07 22:15:11 +00:00
animated_list Fix gets removedItem instead of its index (#119638) 2023-02-03 00:15:58 +00:00
animated_size Add test for animated_size.0.dart API example. (#147828) 2024-05-10 21:55:51 +00:00
animated_switcher Add tests for animated_switcher.0.dart API example. (#149180) 2024-05-29 12:10:34 +00:00
app Rename Sample classes (#124080) 2023-04-04 20:34:29 +00:00
app_lifecycle_listener Fix typo (#141426) 2024-01-11 17:05:01 -08:00
async Add test for future_builder.0.dart (#148453) 2024-05-27 07:12:56 +00:00
autocomplete Test raw autocomplete api examples (#148234) 2024-05-23 08:52:13 +00:00
basic Fix MultiChildLayoutDelegate.hasChild doc (#126433) 2023-05-11 14:59:07 +00:00
binding Add AppLifecycleListener, with support for application exit handling (#123274) 2023-06-08 22:57:19 +00:00
dismissible Add test for dismissible.0.dart API example. (#146723) 2024-04-19 19:21:08 +00:00
drag_target Add test for draggable.0.dart API example. (#147941) 2024-05-10 21:54:16 +00:00
draggable_scrollable_sheet Fixed a lot of typos (#141431) 2024-01-12 22:10:25 +00:00
editable_text Add tests for editable_text.on_changed.0.dart API example. (#148874) 2024-05-24 19:21:12 +00:00
focus_manager Add test for focus_node.0.dart API example. (#146943) 2024-04-23 20:32:07 +00:00
focus_scope Add test for focus example 2 (#147624) 2024-05-21 18:53:55 +00:00
form Write Tests for API Example of form.0.dart (#142635) 2024-02-01 21:54:46 +00:00
gesture_detector Add tests for gesture_detector.0.dart and gesture_detector.1.dart API examples. (#146724) 2024-04-19 23:08:04 +00:00
hardware_keyboard Explain the "patching" protocol in KeyMessageManager.keyMessageHandler and add an example (#105280) 2022-07-26 05:42:05 +00:00
heroes Dev, examples/api, etc updated for Material 3 by default (#129683) 2023-06-28 09:41:58 -07:00
image Add test for image.error_builder.0.dart API example. (#148497) 2024-05-20 16:11:20 +00:00
implicit_animations Add test for animated_fractionally_sized_box.0.dart API example. (#146721) 2024-05-01 16:03:12 +00:00
inherited_model InheritedModel: Add a complete interactive example and update snippet for null safety (#104174) 2022-05-30 06:13:10 -07:00
inherited_theme Add test for inherited_theme.0.dart (#149120) 2024-05-29 20:05:25 +00:00
interactive_viewer Update example code and docs for InteractiveViewer.builder (#98623) 2022-02-16 17:25:17 -08:00
layout_builder Rename Sample classes (#124080) 2023-04-04 20:34:29 +00:00
magnifier Rename Sample classes (#124080) 2023-04-04 20:34:29 +00:00
navigator_pop_handler Reland root predictive back (#132249) 2023-08-17 23:55:05 +00:00
nested_scroll_view Adds tests to NestedScrollView examples (#148170) 2024-05-21 16:35:04 +00:00
overflow_bar Added missing tests for OverflowBar example. (#146780) 2024-04-16 22:10:56 +00:00
overlay Rename Sample classes (#124080) 2023-04-04 20:34:29 +00:00
page Refactors page API (#137792) 2024-05-13 22:45:51 +00:00
page_view Reland "Remove hack from PageView." (#142172) 2024-01-24 23:44:11 +00:00
pop_scope Reapply new PopScope API (#147607) 2024-05-07 09:04:49 -07:00
preferred_size Add test for preferred_size.0.dart API example. (#146725) 2024-04-19 19:08:07 +00:00
restoration_properties Add tests for restorable_value.0.dart API example. (#148676) 2024-05-23 08:34:23 +00:00
routes Update RouteObserver example and fix an error thrown (#141166) 2024-01-09 20:48:56 +00:00
scroll_end_notification Scrollbar thumb drag gestures now produce one start and one end scroll notification (#146654) 2024-06-04 22:02:12 +00:00
scroll_notification_observer Add ScrollNotificationObserver sample (#127023) 2023-05-25 15:58:52 +00:00
scroll_position Scrollbar thumb drag gestures now produce one start and one end scroll notification (#146654) 2024-06-04 22:02:12 +00:00
scroll_view Add findChildIndexCallback examples (#133469) 2023-10-18 00:26:17 +00:00
scrollbar Add an example for how to hide default scrollbar on desktop platform. (#108542) 2022-08-18 13:09:23 +00:00
shared_app_data Add tests for shared_app_data.#.dart API examples. (#147830) 2024-05-20 17:49:04 +00:00
shortcuts Add tests for logical_key_set.0.dart API example. (#147735) 2024-05-20 17:47:10 +00:00
sliver Fix DecoratedSliver sample code to reflect the description (#148621) 2024-05-23 08:52:15 +00:00
sliver_fill test sliver fill remaining examples (#148041) 2024-05-13 15:30:49 +00:00
slotted_render_object_widget Reland "Mixin for slotted RenderObjectWidgets and RenderBox (#94077)" (#94632) 2021-12-03 14:39:02 -08:00
system_context_menu Reland Native ios context menu (#143002) (#148238) (#148265) 2024-05-15 18:37:05 +00:00
table Added missing tests for Table api example table.0.dart. (#147318) 2024-04-26 21:30:17 +00:00
tap_region Replace FocusTrap with TapRegionSurface (#107262) 2022-07-29 16:00:07 +00:00
text Add one DefaultTextStyle example (#122182) 2023-03-08 20:40:54 +00:00
text_magnifier Disable flaky golden file test (#144351) 2024-02-28 18:10:50 -06:00
transitions Test remaining transitions api examples (#148302) 2024-05-23 18:57:14 +00:00
tween_animation_builder Add tests for tween_animation_builder.0.dart API example. (#148902) 2024-05-30 20:17:04 +00:00
undo_history Add test for undo_history_controller.0.dart (#148205) 2024-05-21 22:19:04 +00:00
value_listenable_builder Add some cross references in the docs, move an example to a dartpad example (#145571) 2024-03-22 02:35:11 +00:00
navigator_utils.dart Reland root predictive back (#132249) 2023-08-17 23:55:05 +00:00