Unverified Commit e1276657 authored by Kate Lovett's avatar Kate Lovett Committed by GitHub

Update MaterialScrollBehavior.buildScrollbar for horizontal axes (#87740)

parent 64009135
......@@ -693,8 +693,13 @@ class MaterialApp extends StatefulWidget {
/// [GlowingOverscrollIndicator] to [Scrollable] descendants when executing on
/// [TargetPlatform.android] and [TargetPlatform.fuchsia].
///
/// When using the desktop platform, if the [Scrollable] widget scrolls in the
/// [Axis.vertical], a [Scrollbar] is applied.
/// The [buildScrollbar] function is called by the [Scrollable] to wrap with a
/// [Scrollbar] when appropriate. On all platforms, when the Scrollable [Axis] is
/// [Axis.horizontal], an always visible Scrollbar will be applied. This is
/// because horizontal [ScrollView]s have lower discoverability as scrollable
/// content. When the Axis is [Axis.vertical] a Scrollbar is applied on
/// desktop platforms. In this vertical case, [Scrollbar.isAlwaysShown] is not
/// set and will defer to the inherited [ScrollbarTheme].
///
/// See also:
///
......@@ -716,7 +721,11 @@ class MaterialScrollBehavior extends ScrollBehavior {
// the base class as well.
switch (axisDirectionToAxis(details.direction)) {
case Axis.horizontal:
return child;
return Scrollbar(
isAlwaysShown: true,
controller: details.controller,
child: child,
);
case Axis.vertical:
switch (getPlatform(context)) {
case TargetPlatform.linux:
......
......@@ -1308,13 +1308,16 @@ class _TabBarState extends State<TabBar> {
if (widget.isScrollable) {
_scrollController ??= _TabBarScrollController(this);
tabBar = SingleChildScrollView(
tabBar = ScrollConfiguration(
behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false),
child: SingleChildScrollView(
dragStartBehavior: widget.dragStartBehavior,
scrollDirection: Axis.horizontal,
controller: _scrollController,
padding: widget.padding,
physics: widget.physics,
child: tabBar,
),
);
} else if (widget.padding != null) {
tabBar = Padding(
......
......@@ -1557,4 +1557,20 @@ void main() {
),
);
});
testWidgets('MaterialScrollBehavior applies always shown Scrollbar to horizontal scrollables', (WidgetTester tester) async {
final ScrollController controller = ScrollController();
await tester.pumpWidget(MaterialApp(
home: SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: controller,
child: const SizedBox(
width: 4000.0,
height: 4000.0,
),
),
));
await tester.pumpAndSettle();
expect(find.byType(Scrollbar), paints..rect());
});
}
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