Auto-format Framework (#160545)

This auto-formats all *.dart files in the repository outside of the
`engine` subdirectory and enforces that these files stay formatted with
a presubmit check.

**Reviewers:** Please carefully review all the commits except for the
one titled "formatted". The "formatted" commit was auto-generated by
running `dev/tools/format.sh -a -f`. The other commits were hand-crafted
to prepare the repo for the formatting change. I recommend reviewing the
commits one-by-one via the "Commits" tab and avoiding Github's "Files
changed" tab as it will likely slow down your browser because of the
size of this PR.

---------

Co-authored-by: Kate Lovett <katelovett@google.com>
Co-authored-by: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com>
This commit is contained in:
Michael Goderbauer
2024-12-19 12:06:21 -08:00
committed by GitHub
parent 8e0993eda8
commit 5491c8c146
4411 changed files with 455108 additions and 415991 deletions

View File

@@ -32,6 +32,7 @@ Future<void> setClipboard(String message) async {
});
completer.complete();
}
if (SchedulerBinding.instance.hasScheduledFrame) {
SchedulerBinding.instance.addPostFrameCallback(completeSetClipboard);
} else {
@@ -44,11 +45,13 @@ Future<AndroidSemanticsNode> getSemantics(Finder finder, WidgetTester tester) as
final int id = tester.getSemantics(finder).id;
final Completer<String> completer = Completer<String>();
Future<void> completeSemantics([Object? _]) async {
final dynamic result = await kSemanticsChannel.invokeMethod<dynamic>('getSemanticsNode', <String, dynamic>{
'id': id,
});
final dynamic result = await kSemanticsChannel.invokeMethod<dynamic>(
'getSemanticsNode',
<String, dynamic>{'id': id},
);
completer.complete(json.encode(result));
}
if (SchedulerBinding.instance.hasScheduledFrame) {
SchedulerBinding.instance.addPostFrameCallback(completeSemantics);
} else {
@@ -94,9 +97,7 @@ Future<void> main() async {
isFocusable: true,
isFocused: false,
isPassword: false,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
// We can't predict the a11y focus when the screen changes.
ignoredActions: ignoredAccessibilityFocusActions,
),
@@ -163,9 +164,7 @@ Future<void> main() async {
isFocusable: true,
isFocused: false,
isPassword: true,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
// We can't predict the a11y focus when the screen changes.
ignoredActions: ignoredAccessibilityFocusActions,
),
@@ -229,7 +228,9 @@ Future<void> main() async {
testWidgets('Checkbox has correct Android semantics', (WidgetTester tester) async {
final Finder checkbox = find.byKey(const ValueKey<String>(checkboxKeyValue));
final Finder disabledCheckbox = find.byKey(const ValueKey<String>(disabledCheckboxKeyValue));
final Finder disabledCheckbox = find.byKey(
const ValueKey<String>(disabledCheckboxKeyValue),
);
await prepareSelectionControls(tester);
expect(
@@ -241,9 +242,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
@@ -259,9 +258,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
expect(
@@ -289,9 +286,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
@@ -307,9 +302,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
}, timeout: Timeout.none);
@@ -327,9 +320,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
@@ -345,9 +336,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
}, timeout: Timeout.none);
@@ -367,9 +356,7 @@ Future<void> main() async {
isFocusable: true,
contentDescription: switchLabel,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
}, timeout: Timeout.none);
@@ -396,9 +383,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
@@ -416,9 +401,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
reason: "Popup $item doesn't have the right semantics",
);
@@ -441,9 +424,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
reason: "Popup $item doesn't have the right semantics the second time",
);
@@ -466,9 +447,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
@@ -494,9 +473,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
reason: "Dropdown $item doesn't have the right semantics",
);
@@ -532,9 +509,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
reason: "Dropdown $item doesn't have the right semantics the second time.",
);
@@ -562,9 +537,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
);
@@ -581,9 +554,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
reason: "Alert OK button doesn't have the right semantics",
);
@@ -621,9 +592,7 @@ Future<void> main() async {
isEnabled: true,
isFocusable: true,
ignoredActions: ignoredAccessibilityFocusActions,
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.click,
],
actions: <AndroidSemanticsAction>[AndroidSemanticsAction.click],
),
reason: "Alert OK button doesn't have the right semantics",
);
@@ -657,7 +626,9 @@ Future<void> main() async {
await tester.pumpAndSettle();
}
testWidgets('AppBar title has correct Android heading semantics', (WidgetTester tester) async {
testWidgets('AppBar title has correct Android heading semantics', (
WidgetTester tester,
) async {
await prepareHeading(tester);
expect(
await getSemantics(find.byKey(const ValueKey<String>(appBarTitleKeyValue)), tester),

View File

@@ -14,9 +14,9 @@ void main() {
}
Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
selectionControlsRoute : (BuildContext context) => const SelectionControlsPage(),
popupControlsRoute : (BuildContext context) => const PopupControlsPage(),
textFieldRoute : (BuildContext context) => const TextFieldPage(),
selectionControlsRoute: (BuildContext context) => const SelectionControlsPage(),
popupControlsRoute: (BuildContext context) => const PopupControlsPage(),
textFieldRoute: (BuildContext context) => const TextFieldPage(),
headingsRoute: (BuildContext context) => const HeadingsPage(),
};
@@ -31,17 +31,18 @@ class TestApp extends StatelessWidget {
builder: (BuildContext context) {
return Scaffold(
body: ListView(
children: routes.keys.map<Widget>((String value) {
return MaterialButton(
child: Text(value),
onPressed: () {
Navigator.of(context).pushNamed(value);
},
);
}).toList(),
children:
routes.keys.map<Widget>((String value) {
return MaterialButton(
child: Text(value),
onPressed: () {
Navigator.of(context).pushNamed(value);
},
);
}).toList(),
),
);
}
},
),
);
}

View File

@@ -156,8 +156,7 @@ class AndroidSemanticsNode {
}
return <AndroidSemanticsAction>[
for (final int id in actions)
if (AndroidSemanticsAction.deserialize(id) case final AndroidSemanticsAction action)
action,
if (AndroidSemanticsAction.deserialize(id) case final AndroidSemanticsAction action) action,
];
}
@@ -167,7 +166,6 @@ class AndroidSemanticsNode {
}
}
/// A Dart VM implementation of a rectangle.
///
/// Created to mirror the implementation of [ui.Rect].
@@ -198,11 +196,11 @@ class Rect {
if (other.runtimeType != runtimeType) {
return false;
}
return other is Rect
&& other.top == top
&& other.left == left
&& other.right == right
&& other.bottom == bottom;
return other is Rect &&
other.top == top &&
other.left == left &&
other.right == right &&
other.bottom == bottom;
}
@override
@@ -231,9 +229,7 @@ class Size {
if (other.runtimeType != runtimeType) {
return false;
}
return other is Size
&& other.width == width
&& other.height == height;
return other is Size && other.width == width && other.height == height;
}
@override

View File

@@ -29,7 +29,6 @@ class AndroidClassName {
/// Action constants which correspond to `AccessibilityAction` in Android.
enum AndroidSemanticsAction {
/// Matches `AccessibilityAction.ACTION_FOCUS`.
focus(_kFocusIndex),

View File

@@ -77,7 +77,10 @@ class _AndroidSemanticsMatcher extends Matcher {
this.isHeading,
this.isPassword,
this.isLongClickable,
}) : assert(ignoredActions == null || actions != null, 'actions must not be null if ignoredActions is not null'),
}) : assert(
ignoredActions == null || actions != null,
'actions must not be null if ignoredActions is not null',
),
assert(ignoredActions == null || !actions!.any(ignoredActions.contains));
final String? text;
@@ -105,7 +108,7 @@ class _AndroidSemanticsMatcher extends Matcher {
description.add(' with text: $text');
}
if (contentDescription != null) {
description.add( 'with contentDescription $contentDescription');
description.add('with contentDescription $contentDescription');
}
if (className != null) {
description.add(' with className: $className');
@@ -178,14 +181,25 @@ class _AndroidSemanticsMatcher extends Matcher {
itemActions.removeWhere(ignoredActions!.contains);
}
if (!unorderedEquals(actions!).matches(itemActions, matchState)) {
final List<String> actionsString = actions!.map<String>((AndroidSemanticsAction action) => action.toString()).toList()..sort();
final List<String> itemActionsString = itemActions.map<String>((AndroidSemanticsAction action) => action.toString()).toList()..sort();
final Set<String> unexpectedInString = itemActionsString.toSet().difference(actionsString.toSet());
final Set<String> missingInString = actionsString.toSet().difference(itemActionsString.toSet());
final List<String> actionsString =
actions!.map<String>((AndroidSemanticsAction action) => action.toString()).toList()
..sort();
final List<String> itemActionsString =
itemActions.map<String>((AndroidSemanticsAction action) => action.toString()).toList()
..sort();
final Set<String> unexpectedInString = itemActionsString.toSet().difference(
actionsString.toSet(),
);
final Set<String> missingInString = actionsString.toSet().difference(
itemActionsString.toSet(),
);
if (missingInString.isEmpty && unexpectedInString.isEmpty) {
return true;
}
return _failWithMessage('Expected actions: $actionsString\nActual actions: $itemActionsString\nUnexpected: $unexpectedInString\nMissing: $missingInString', matchState);
return _failWithMessage(
'Expected actions: $actionsString\nActual actions: $itemActionsString\nUnexpected: $unexpectedInString\nMissing: $missingInString',
matchState,
);
}
}
if (isChecked != null && isChecked != item.isChecked) {
@@ -220,10 +234,16 @@ class _AndroidSemanticsMatcher extends Matcher {
}
@override
Description describeMismatch(dynamic item, Description mismatchDescription,
Map<dynamic, dynamic> matchState, bool verbose) {
Description describeMismatch(
dynamic item,
Description mismatchDescription,
Map<dynamic, dynamic> matchState,
bool verbose,
) {
final String? failure = matchState['failure'] as String?;
return mismatchDescription.add(failure ?? 'hasAndroidSemantics matcher does not complete successfully');
return mismatchDescription.add(
failure ?? 'hasAndroidSemantics matcher does not complete successfully',
);
}
bool _failWithMessage(String value, Map<dynamic, dynamic> matchState) {

View File

@@ -57,47 +57,39 @@ class _SelectionControlsPageState extends State<SelectionControlsPage> {
return Scaffold(
appBar: AppBar(leading: const BackButton(key: ValueKey<String>('back'))),
body: Material(
child: Column(children: <Widget>[
Row(
children: <Widget>[
Checkbox(
key: checkbox1Key,
value: _isChecked,
onChanged: _updateCheckbox,
),
const Checkbox(
key: checkbox2Key,
value: false,
onChanged: null,
),
],
),
const Spacer(),
Row(children: <Widget>[
Radio<int>(key: radio1Key, value: 0, groupValue: _radio, onChanged: _updateRadio),
Radio<int>(key: radio2Key, value: 1, groupValue: _radio, onChanged: _updateRadio),
Radio<int>(key: radio3Key, value: 2, groupValue: _radio, onChanged: _updateRadio),
]),
const Spacer(),
Switch(
key: switchKey,
value: _isOn,
onChanged: _updateSwitch,
),
const Spacer(),
MergeSemantics(
child: Row(
child: Column(
children: <Widget>[
Row(
children: <Widget>[
const Text(switchLabel),
Switch(
key: labeledSwitchKey,
value: _isLabeledOn,
onChanged: _updateLabeledSwitch,
),
Checkbox(key: checkbox1Key, value: _isChecked, onChanged: _updateCheckbox),
const Checkbox(key: checkbox2Key, value: false, onChanged: null),
],
),
),
]),
const Spacer(),
Row(
children: <Widget>[
Radio<int>(key: radio1Key, value: 0, groupValue: _radio, onChanged: _updateRadio),
Radio<int>(key: radio2Key, value: 1, groupValue: _radio, onChanged: _updateRadio),
Radio<int>(key: radio3Key, value: 2, groupValue: _radio, onChanged: _updateRadio),
],
),
const Spacer(),
Switch(key: switchKey, value: _isOn, onChanged: _updateSwitch),
const Spacer(),
MergeSemantics(
child: Row(
children: <Widget>[
const Text(switchLabel),
Switch(
key: labeledSwitchKey,
value: _isLabeledOn,
onChanged: _updateLabeledSwitch,
),
],
),
),
],
),
),
);
}

View File

@@ -21,9 +21,7 @@ class HeadingsPage extends StatelessWidget {
leading: const BackButton(key: ValueKey<String>('back')),
title: const Text('Heading', key: _appBarTitleKey),
),
body: const Center(
child: Text('Body text', key: _bodyTextKey),
),
body: const Center(child: Text('Body text', key: _bodyTextKey)),
);
}
}

View File

@@ -53,13 +53,14 @@ class _PopupControlsPageState extends State<PopupControlsPage> {
DropdownButton<String>(
key: const ValueKey<String>(dropdownButtonKeyValue),
value: dropdownValue,
items: popupItems.map<DropdownMenuItem<String>>((String item) {
return DropdownMenuItem<String>(
key: ValueKey<String>('$dropdownKeyValue.$item'),
value: item,
child: Text(item),
);
}).toList(),
items:
popupItems.map<DropdownMenuItem<String>>((String item) {
return DropdownMenuItem<String>(
key: ValueKey<String>('$dropdownKeyValue.$item'),
value: item,
child: Text(item),
);
}).toList(),
onChanged: (String? value) {
setState(() {
dropdownValue = value!;
@@ -76,12 +77,21 @@ class _PopupControlsPageState extends State<PopupControlsPage> {
builder: (BuildContext context) {
return AlertDialog(
key: const ValueKey<String>(alertKeyValue),
title: const Text('Title text', key: ValueKey<String>('$alertKeyValue.Title')),
title: const Text(
'Title text',
key: ValueKey<String>('$alertKeyValue.Title'),
),
content: const SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text('Body text line 1.', key: ValueKey<String>('$alertKeyValue.Body1')),
Text('Body text line 2.', key: ValueKey<String>('$alertKeyValue.Body2')),
Text(
'Body text line 1.',
key: ValueKey<String>('$alertKeyValue.Body1'),
),
Text(
'Body text line 2.',
key: ValueKey<String>('$alertKeyValue.Body2'),
),
],
),
),

View File

@@ -28,19 +28,18 @@ class _TextFieldPageState extends State<TextFieldPage> {
return Scaffold(
appBar: AppBar(leading: BackButton(key: backButtonKey)),
body: Material(
child: Column(children: <Widget>[
TextField(
key: normalTextFieldKey,
controller: _normalController,
),
const Spacer(),
TextField(
key: passwordTextFieldKey,
controller: _passwordController,
obscureText: true,
),
],
child: Column(
children: <Widget>[
TextField(key: normalTextFieldKey, controller: _normalController),
const Spacer(),
TextField(
key: passwordTextFieldKey,
controller: _passwordController,
obscureText: true,
),
],
),
),
));
);
}
}

View File

@@ -71,26 +71,29 @@ void main() {
test('matches all android semantics properties', () {
final AndroidSemanticsNode node = AndroidSemanticsNode.deserialize(source);
expect(node, hasAndroidSemantics(
isChecked: false,
isCheckable: false,
isEditable: false,
isFocusable: false,
isFocused: false,
isPassword: false,
isLongClickable: false,
text: 'hello',
contentDescription: 'other hello',
className: 'android.view.View',
id: 23,
rect: const Rect.fromLTRB(0.0, 0.0, 10.0, 10.0),
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.focus,
AndroidSemanticsAction.clearFocus,
AndroidSemanticsAction.select,
],
size: const Size(10.0, 10.0),
));
expect(
node,
hasAndroidSemantics(
isChecked: false,
isCheckable: false,
isEditable: false,
isFocusable: false,
isFocused: false,
isPassword: false,
isLongClickable: false,
text: 'hello',
contentDescription: 'other hello',
className: 'android.view.View',
id: 23,
rect: const Rect.fromLTRB(0.0, 0.0, 10.0, 10.0),
actions: <AndroidSemanticsAction>[
AndroidSemanticsAction.focus,
AndroidSemanticsAction.clearFocus,
AndroidSemanticsAction.select,
],
size: const Size(10.0, 10.0),
),
);
});
});
}