Unverified Commit 9cb2d4d6 authored by chunhtai's avatar chunhtai Committed by GitHub

Fixed the sliver appbar to have a fixed traversal order (#65049)

parent 0bb1e573
...@@ -698,12 +698,20 @@ class _AppBarState extends State<AppBar> { ...@@ -698,12 +698,20 @@ class _AppBarState extends State<AppBar> {
appBar = Stack( appBar = Stack(
fit: StackFit.passthrough, fit: StackFit.passthrough,
children: <Widget>[ children: <Widget>[
widget.flexibleSpace, Semantics(
// Creates a material widget to prevent the flexibleSpace from sortKey: const OrdinalSortKey(1.0),
// obscuring the ink splashes produced by appBar children. explicitChildNodes: true,
Material( child: widget.flexibleSpace,
type: MaterialType.transparency, ),
child: appBar, Semantics(
sortKey: const OrdinalSortKey(0.0),
explicitChildNodes: true,
// Creates a material widget to prevent the flexibleSpace from
// obscuring the ink splashes produced by appBar children.
child: Material(
type: MaterialType.transparency,
child: appBar,
),
), ),
], ],
); );
......
...@@ -1649,12 +1649,94 @@ void main() { ...@@ -1649,12 +1649,94 @@ void main() {
TestSemantics( TestSemantics(
children: <TestSemantics>[ children: <TestSemantics>[
TestSemantics( TestSemantics(
label: 'Leading', children: <TestSemantics>[
textDirection: TextDirection.ltr, TestSemantics(
label: 'Leading',
textDirection: TextDirection.ltr,
),
TestSemantics(
label: 'Action 1',
textDirection: TextDirection.ltr,
),
],
),
TestSemantics(),
],
),
TestSemantics(
flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling],
),
],
),
],
),
],
),
],
),
],
),
ignoreRect: true,
ignoreTransform: true,
ignoreId: true,
));
semantics.dispose();
});
testWidgets('SliverAppBar with flexable space has correct semantics order', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/64922.
final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(
const MaterialApp(
home: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
leading: Text('Leading'),
flexibleSpace: Text('Flexible space'),
actions: <Widget>[Text('Action 1')],
),
],
),
),
);
expect(semantics, hasSemantics(
TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
textDirection: TextDirection.ltr,
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
children: <TestSemantics>[
TestSemantics(
label: 'Leading',
textDirection: TextDirection.ltr,
),
TestSemantics(
label: 'Action 1',
textDirection: TextDirection.ltr,
),
],
), ),
TestSemantics( TestSemantics(
label: 'Action 1', children: <TestSemantics>[
textDirection: TextDirection.ltr, TestSemantics(
flags: <SemanticsFlag>[SemanticsFlag.isHeader],
label: 'Flexible space',
textDirection: TextDirection.ltr,
),
],
), ),
], ],
), ),
......
...@@ -178,25 +178,37 @@ void main() { ...@@ -178,25 +178,37 @@ void main() {
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, expandedHeight), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, expandedHeight),
children: <TestSemantics>[ children: <TestSemantics>[
TestSemantics( TestSemantics(
id: 11, id: 12,
rect: const Rect.fromLTRB(0.0, 0.0, 100.0, 20.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 200.0),
flags: <SemanticsFlag>[ children: <TestSemantics>[
SemanticsFlag.isHeader, TestSemantics(
SemanticsFlag.namesRoute id: 13,
rect: const Rect.fromLTRB(0.0, 0.0, 100.0, 20.0),
flags: <SemanticsFlag>[
SemanticsFlag.isHeader,
SemanticsFlag.namesRoute
],
label: 'Title',
textDirection: TextDirection.ltr,
),
], ],
label: 'Title',
textDirection: TextDirection.ltr,
), ),
TestSemantics( TestSemantics(
id: 10, id: 10,
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, expandedHeight), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 200.0),
label: 'Expanded title', children: <TestSemantics>[
textDirection: TextDirection.ltr, TestSemantics(
id: 11,
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, expandedHeight),
label: 'Expanded title',
textDirection: TextDirection.ltr,
),
],
), ),
], ],
), ),
TestSemantics( TestSemantics(
id: 12, id: 14,
flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling], flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling],
rect: TestSemantics.fullScreen, rect: TestSemantics.fullScreen,
actions: <SemanticsAction>[SemanticsAction.scrollUp], actions: <SemanticsAction>[SemanticsAction.scrollUp],
...@@ -272,27 +284,39 @@ void main() { ...@@ -272,27 +284,39 @@ void main() {
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 56.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 56.0),
children: <TestSemantics>[ children: <TestSemantics>[
TestSemantics( TestSemantics(
id: 11, id: 12,
rect: const Rect.fromLTRB(0.0, 0.0, 100.0, 20.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 56.0),
flags: <SemanticsFlag>[ children: <TestSemantics>[
SemanticsFlag.isHeader, TestSemantics(
SemanticsFlag.namesRoute id: 13,
rect: const Rect.fromLTRB(0.0, 0.0, 100.0, 20.0),
flags: <SemanticsFlag>[
SemanticsFlag.isHeader,
SemanticsFlag.namesRoute
],
label: 'Title',
textDirection: TextDirection.ltr,
),
], ],
label: 'Title',
textDirection: TextDirection.ltr,
), ),
// The flexible space bar still persists in the // The flexible space bar still persists in the
// semantic tree even if it is collapsed. // semantic tree even if it is collapsed.
TestSemantics( TestSemantics(
id: 10, id: 10,
rect: const Rect.fromLTRB(0.0, 36.0, 800.0, 92.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 56.0),
label: 'Expanded title', children: <TestSemantics>[
textDirection: TextDirection.ltr, TestSemantics(
id: 11,
rect: const Rect.fromLTRB(0.0, 36.0, 800.0, 92.0),
label: 'Expanded title',
textDirection: TextDirection.ltr,
),
],
), ),
], ],
), ),
TestSemantics( TestSemantics(
id: 12, id: 14,
flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling], flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling],
rect: TestSemantics.fullScreen, rect: TestSemantics.fullScreen,
actions: <SemanticsAction>[SemanticsAction.scrollUp, SemanticsAction.scrollDown], actions: <SemanticsAction>[SemanticsAction.scrollUp, SemanticsAction.scrollDown],
...@@ -324,20 +348,20 @@ void main() { ...@@ -324,20 +348,20 @@ void main() {
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
), ),
TestSemantics( TestSemantics(
id: 13, id: 15,
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 200.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 200.0),
label: 'Item 4', label: 'Item 4',
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
), ),
TestSemantics( TestSemantics(
id: 14, id: 16,
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 200.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 200.0),
flags: <SemanticsFlag>[SemanticsFlag.isHidden], flags: <SemanticsFlag>[SemanticsFlag.isHidden],
label: 'Item 5', label: 'Item 5',
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
), ),
TestSemantics( TestSemantics(
id: 15, id: 17,
rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 50.0), rect: const Rect.fromLTRB(0.0, 0.0, 800.0, 50.0),
flags: <SemanticsFlag>[SemanticsFlag.isHidden], flags: <SemanticsFlag>[SemanticsFlag.isHidden],
label: 'Item 6', label: 'Item 6',
......
...@@ -986,13 +986,18 @@ void _tests() { ...@@ -986,13 +986,18 @@ void _tests() {
TestSemantics( TestSemantics(
tags: <SemanticsTag>[RenderViewport.excludeFromScrolling], tags: <SemanticsTag>[RenderViewport.excludeFromScrolling],
children: <TestSemantics>[ children: <TestSemantics>[
TestSemantics( TestSemantics(),
flags: <SemanticsFlag>[ TestSemantics(
SemanticsFlag.namesRoute, children: <TestSemantics>[
SemanticsFlag.isHeader, TestSemantics(
flags: <SemanticsFlag>[
SemanticsFlag.namesRoute,
SemanticsFlag.isHeader,
],
label: 'Forward app bar',
textDirection: TextDirection.ltr,
),
], ],
label: 'Forward app bar',
textDirection: TextDirection.ltr,
), ),
], ],
), ),
...@@ -1096,13 +1101,18 @@ void _tests() { ...@@ -1096,13 +1101,18 @@ void _tests() {
TestSemantics( TestSemantics(
tags: <SemanticsTag>[RenderViewport.excludeFromScrolling], tags: <SemanticsTag>[RenderViewport.excludeFromScrolling],
children: <TestSemantics>[ children: <TestSemantics>[
TestSemantics( TestSemantics(),
flags: <SemanticsFlag>[ TestSemantics(
SemanticsFlag.namesRoute, children: <TestSemantics>[
SemanticsFlag.isHeader, TestSemantics(
flags: <SemanticsFlag>[
SemanticsFlag.namesRoute,
SemanticsFlag.isHeader,
],
label: 'Backward app bar',
textDirection: TextDirection.ltr,
),
], ],
label: 'Backward app bar',
textDirection: TextDirection.ltr,
), ),
], ],
), ),
......
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