forked from firka/flutter
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:
committed by
GitHub
parent
8e0993eda8
commit
5491c8c146
@@ -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),
|
||||
|
||||
@@ -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(),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -29,7 +29,6 @@ class AndroidClassName {
|
||||
|
||||
/// Action constants which correspond to `AccessibilityAction` in Android.
|
||||
enum AndroidSemanticsAction {
|
||||
|
||||
/// Matches `AccessibilityAction.ACTION_FOCUS`.
|
||||
focus(_kFocusIndex),
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
));
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user