Use scrollPhysics.allowImplicitScrolling to configure scrollable semantics (#20210)

This commit is contained in:
Jonah Williams 2018-08-07 17:09:14 -07:00 committed by GitHub
parent 57d8930d5b
commit b32c77a012
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 52 additions and 5 deletions

View file

@ -3136,6 +3136,18 @@ class SemanticsConfiguration {
_setFlag(SemanticsFlag.isObscured, value);
}
/// Whether the platform can scroll the semantics node when the user attempts
/// to move focus to an offscreen child.
///
/// For example, a [ListView] widget has implicit scrolling so that users can
/// easily move to the next visible set of children. A [TabBar] widget does
/// not have implicit scrolling, so that users can navigate into the tab
/// body when reaching the end of the tab bar.
bool get hasImplicitScrolling => _hasFlag(SemanticsFlag.hasImplicitScrolling);
set hasImplicitScrolling(bool value) {
_setFlag(SemanticsFlag.hasImplicitScrolling, value);
}
/// The currently selected text (or the position of the cursor) within [value]
/// if this node represents a text field.
TextSelection get textSelection => _textSelection;

View file

@ -508,6 +508,7 @@ class ScrollableState extends State<Scrollable> with TickerProviderStateMixin
key: _excludableScrollSemanticsKey,
child: result,
position: position,
allowImplicitScrolling: widget?.physics?.allowImplicitScrolling ?? false,
);
}
@ -539,25 +540,39 @@ class _ExcludableScrollSemantics extends SingleChildRenderObjectWidget {
const _ExcludableScrollSemantics({
Key key,
@required this.position,
@required this.allowImplicitScrolling,
Widget child
}) : assert(position != null), super(key: key, child: child);
final ScrollPosition position;
final bool allowImplicitScrolling;
@override
_RenderExcludableScrollSemantics createRenderObject(BuildContext context) => new _RenderExcludableScrollSemantics(position: position);
_RenderExcludableScrollSemantics createRenderObject(BuildContext context) {
return new _RenderExcludableScrollSemantics(
position: position,
allowImplicitScrolling: allowImplicitScrolling,
);
}
@override
void updateRenderObject(BuildContext context, _RenderExcludableScrollSemantics renderObject) {
renderObject.position = position;
renderObject
..allowImplicitScrolling = allowImplicitScrolling
..position = position;
}
}
class _RenderExcludableScrollSemantics extends RenderProxyBox {
_RenderExcludableScrollSemantics({
@required ScrollPosition position,
@required bool allowImplicitScrolling,
RenderBox child,
}) : _position = position, assert(position != null), super(child) {
}) : _position = position,
_allowImplicitScrolling = allowImplicitScrolling,
assert(position != null), super(child) {
position.addListener(markNeedsSemanticsUpdate);
}
@ -574,12 +589,23 @@ class _RenderExcludableScrollSemantics extends RenderProxyBox {
markNeedsSemanticsUpdate();
}
/// Whether this node can be scrolled implicitly.
bool get allowImplicitScrolling => _allowImplicitScrolling;
bool _allowImplicitScrolling;
set allowImplicitScrolling(bool value) {
if (value == _allowImplicitScrolling)
return;
_allowImplicitScrolling = value;
markNeedsSemanticsUpdate();
}
@override
void describeSemanticsConfiguration(SemanticsConfiguration config) {
super.describeSemanticsConfiguration(config);
config.isSemanticBoundary = true;
if (position.haveDimensions) {
config
..hasImplicitScrolling = allowImplicitScrolling
..scrollPosition = _position.pixels
..scrollExtentMax = _position.maxScrollExtent
..scrollExtentMin = _position.minScrollExtent;

View file

@ -428,6 +428,7 @@ void _defineTests() {
flags
..remove(SemanticsFlag.hasImplicitScrolling)
..remove(SemanticsFlag.hasToggledState)
..remove(SemanticsFlag.hasImplicitScrolling)
..remove(SemanticsFlag.isToggled);
TestSemantics expectedSemantics = new TestSemantics.root(
children: <TestSemantics>[
@ -473,6 +474,7 @@ void _defineTests() {
flags
..remove(SemanticsFlag.hasImplicitScrolling)
..remove(SemanticsFlag.hasCheckedState)
..remove(SemanticsFlag.hasImplicitScrolling)
..remove(SemanticsFlag.isChecked);
expectedSemantics = new TestSemantics.root(

View file

@ -342,6 +342,9 @@ void main() {
new TestSemantics.rootChild(
children: <TestSemantics>[
new TestSemantics(
flags: <SemanticsFlag>[
SemanticsFlag.hasImplicitScrolling,
],
actions: <SemanticsAction>[SemanticsAction.scrollUp],
children: <TestSemantics>[
new TestSemantics(

View file

@ -486,9 +486,9 @@ void main() {
);
final List<SemanticsFlag> flags = SemanticsFlag.values.values.toList();
flags
..remove(SemanticsFlag.hasImplicitScrolling)
..remove(SemanticsFlag.hasToggledState)
..remove(SemanticsFlag.isToggled);
..remove(SemanticsFlag.isToggled)
..remove(SemanticsFlag.hasImplicitScrolling);
TestSemantics expectedSemantics = new TestSemantics.root(
children: <TestSemantics>[

View file

@ -116,6 +116,7 @@ void _tests() {
children: <TestSemantics>[
new TestSemantics(
id: 6,
flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling],
children: <TestSemantics>[
new TestSemantics(
id: 4,

View file

@ -384,6 +384,9 @@ void _tests() {
new TestSemantics(
children: <TestSemantics>[
new TestSemantics(
flags: <SemanticsFlag>[
SemanticsFlag.hasImplicitScrolling,
],
children: <TestSemantics>[
new TestSemantics(
label: 'Item 4',