Fixes AlertDialog and SimpleDialog to not merge their content semantics (#78633)

This commit is contained in:
chunhtai 2021-03-23 12:01:03 -07:00 committed by GitHub
parent 0105c8f377
commit 00592ceb27
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 147 additions and 2 deletions

View file

@ -526,7 +526,10 @@ class AlertDialog extends StatelessWidget {
),
child: DefaultTextStyle(
style: contentTextStyle ?? dialogTheme.contentTextStyle ?? theme.textTheme.subtitle1!,
child: content!,
child: Semantics(
container: true,
child: content!,
),
),
);
}
@ -877,7 +880,11 @@ class SimpleDialog extends StatelessWidget {
),
child: DefaultTextStyle(
style: titleTextStyle ?? DialogTheme.of(context).titleTextStyle ?? theme.textTheme.headline6!,
child: Semantics(namesRoute: label == null, child: title),
child: Semantics(
namesRoute: label == null,
container: true,
child: title
),
),
);
}

View file

@ -1341,6 +1341,71 @@ void main() {
semantics.dispose();
});
// Regression test for https://github.com/flutter/flutter/issues/78229.
testWidgets('AlertDialog has correct semantics for content in iOS', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(
MaterialApp(
theme: ThemeData(platform: TargetPlatform.iOS),
home: const AlertDialog(
title: Text('title'),
content: Text('content'),
actions: <Widget>[ TextButton(onPressed: null, child: Text('action')) ],
),
)
);
expect(semantics, hasSemantics(TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
id: 1,
textDirection: TextDirection.ltr,
children: <TestSemantics>[
TestSemantics(
id: 2,
children: <TestSemantics>[
TestSemantics(
id: 3,
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
children: <TestSemantics>[
TestSemantics(
id: 4,
children: <TestSemantics>[
TestSemantics(
id: 5,
flags: <SemanticsFlag>[SemanticsFlag.namesRoute],
label: 'title',
textDirection: TextDirection.ltr,
),
// The content semantics does not merge into the semantics
// node 4.
TestSemantics(
id: 6,
label: 'content',
textDirection: TextDirection.ltr,
),
TestSemantics(
id: 7,
flags: <SemanticsFlag>[SemanticsFlag.isButton,
SemanticsFlag.hasEnabledState],
label: 'action',
textDirection: TextDirection.ltr,
),
],
),
],
),
],
),
],
),
],
), ignoreTransform: true, ignoreId: true, ignoreRect: true));
semantics.dispose();
});
testWidgets('AlertDialog widget always contains alert route semantics for android', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
@ -1439,6 +1504,79 @@ void main() {
semantics.dispose();
});
// Regression test for https://github.com/flutter/flutter/issues/78229.
testWidgets('SimpleDialog has correct semantics for title in iOS', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(
MaterialApp(
theme: ThemeData(platform: TargetPlatform.iOS),
home: const SimpleDialog(
title: Text('title'),
children: <Widget>[
Text('content'),
TextButton(onPressed: null, child: Text('action'))
],
),
)
);
expect(semantics, hasSemantics(TestSemantics.root(
children: <TestSemantics>[
TestSemantics(
id: 1,
textDirection: TextDirection.ltr,
children: <TestSemantics>[
TestSemantics(
id: 2,
children: <TestSemantics>[
TestSemantics(
id: 3,
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
children: <TestSemantics>[
TestSemantics(
id: 4,
children: <TestSemantics>[
// Title semantics does not merge into the semantics
// node 4.
TestSemantics(
id: 5,
flags: <SemanticsFlag>[SemanticsFlag.namesRoute],
label: 'title',
textDirection: TextDirection.ltr,
),
TestSemantics(
id: 6,
flags: <SemanticsFlag>[SemanticsFlag.hasImplicitScrolling],
children: <TestSemantics>[
TestSemantics(
id: 7,
label: 'content',
textDirection: TextDirection.ltr,
),
TestSemantics(
id: 8,
flags: <SemanticsFlag>[SemanticsFlag.isButton,
SemanticsFlag.hasEnabledState],
label: 'action',
textDirection: TextDirection.ltr,
),
],
),
],
),
],
),
],
),
],
),
],
), ignoreTransform: true, ignoreId: true, ignoreRect: true));
semantics.dispose();
});
testWidgets('Dismissible.confirmDismiss defers to an AlertDialog', (WidgetTester tester) async {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final List<int> dismissedItems = <int>[];