Unverified Commit a7c06e11 authored by Greg Spencer's avatar Greg Spencer Committed by GitHub

Fixed passing autofocus to MaterialButton, and when rebuilding Focus widget. (#39903)

Fixed passing autofocus to MaterialButton, and when rebuilding Focus widget, and added a test for Focus and MaterialButton to test that it works properly.
parent f877c97b
......@@ -367,6 +367,7 @@ class MaterialButton extends StatelessWidget {
shape: buttonTheme.getShape(this),
clipBehavior: clipBehavior,
focusNode: focusNode,
autofocus: autofocus,
animationDuration: buttonTheme.getAnimationDuration(this),
child: child,
materialTapTargetSize: materialTapTargetSize ?? theme.materialTapTargetSize,
......
......@@ -375,6 +375,10 @@ class _FocusState extends State<Focus> {
void didChangeDependencies() {
super.didChangeDependencies();
_focusAttachment?.reparent();
_handleAutofocus();
}
void _handleAutofocus() {
if (!_didAutofocus && widget.autofocus) {
FocusScope.of(context).autofocus(focusNode);
_didAutofocus = true;
......@@ -402,12 +406,15 @@ class _FocusState extends State<Focus> {
if (oldWidget.focusNode == widget.focusNode) {
focusNode.skipTraversal = widget.skipTraversal ?? focusNode.skipTraversal;
focusNode.canRequestFocus = widget.canRequestFocus ?? focusNode.canRequestFocus;
return;
} else {
_focusAttachment.detach();
focusNode.removeListener(_handleFocusChanged);
_initNode();
}
_focusAttachment.detach();
focusNode.removeListener(_handleFocusChanged);
_initNode();
if (oldWidget.autofocus != widget.autofocus) {
_handleAutofocus();
}
}
void _handleFocusChanged() {
......
......@@ -7,7 +7,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
void main() {
testWidgets('Default MaterialButton meets a11y contrast guidelines', (WidgetTester tester) async {
testWidgets('Default $MaterialButton meets a11y contrast guidelines', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
......@@ -34,5 +34,37 @@ void main() {
semanticsEnabled: true,
skip: isBrowser,
);
testWidgets('$MaterialButton gets focus when autofocus is set.', (WidgetTester tester) async {
final FocusNode focusNode = FocusNode(debugLabel: 'MaterialButton');
await tester.pumpWidget(
MaterialApp(
home: Center(
child: MaterialButton(
focusNode: focusNode,
onPressed: () {},
child: Container(width: 100, height: 100, color: const Color(0xffff0000)),
),
),
),
);
await tester.pump();
expect(focusNode.hasPrimaryFocus, isFalse);
await tester.pumpWidget(
MaterialApp(
home: Center(
child: MaterialButton(
autofocus: true,
focusNode: focusNode,
onPressed: () {},
child: Container(width: 100, height: 100, color: const Color(0xffff0000)),
),
),
),
);
await tester.pump();
expect(focusNode.hasPrimaryFocus, isTrue);
});
}
......@@ -1006,6 +1006,29 @@ void main() {
expect(rootNode.hasFocus, isTrue);
expect(rootNode, equals(firstElement.owner.focusManager.rootScope));
});
testWidgets('Can autofocus a node.', (WidgetTester tester) async {
final FocusNode focusNode = FocusNode(debugLabel: 'Test Node');
await tester.pumpWidget(
Focus(
focusNode: focusNode,
child: Container(),
),
);
await tester.pump();
expect(focusNode.hasPrimaryFocus, isFalse);
await tester.pumpWidget(
Focus(
autofocus: true,
focusNode: focusNode,
child: Container(),
),
);
await tester.pump();
expect(focusNode.hasPrimaryFocus, isTrue);
});
});
group(Focus, () {
testWidgets('Focus.of stops at the nearest Focus widget.', (WidgetTester tester) async {
......
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