Unverified Commit ade6a1b3 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Fix a11y scrolling for reversed lists (#52332)

parent 733fc200
......@@ -447,15 +447,23 @@ abstract class ScrollPosition extends ViewportOffset with ScrollMetrics {
void _updateSemanticActions() {
SemanticsAction forward;
SemanticsAction backward;
switch (axis) {
case Axis.vertical:
forward = SemanticsAction.scrollUp;
backward = SemanticsAction.scrollDown;
switch (axisDirection) {
case AxisDirection.up:
forward = SemanticsAction.scrollDown;
backward = SemanticsAction.scrollUp;
break;
case Axis.horizontal:
case AxisDirection.right:
forward = SemanticsAction.scrollLeft;
backward = SemanticsAction.scrollRight;
break;
case AxisDirection.down:
forward = SemanticsAction.scrollUp;
backward = SemanticsAction.scrollDown;
break;
case AxisDirection.left:
forward = SemanticsAction.scrollRight;
backward = SemanticsAction.scrollLeft;
break;
}
final Set<SemanticsAction> actions = <SemanticsAction>{};
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'semantics_tester.dart';
void main() {
group('Available semantic scroll actions', () {
// Regression tests for https://github.com/flutter/flutter/issues/52032.
const int itemCount = 10;
const double itemHeight = 150.0;
testWidgets('forward vertical', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollUp]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollDown]));
semantics.dispose();
});
testWidgets('reverse vertical', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
reverse: true,
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollDown]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollUp]));
semantics.dispose();
});
testWidgets('forward horizontal', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
scrollDirection: Axis.horizontal,
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollLeft]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollRight]));
semantics.dispose();
});
testWidgets('reverse horizontal', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
scrollDirection: Axis.horizontal,
reverse: true,
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollRight]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollLeft]));
semantics.dispose();
});
});
}
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