Fixes issue where navigating to new route breaks FocusNode of previou… (#92615)

This commit is contained in:
JBBx2016 2021-11-05 14:58:05 -04:00 committed by GitHub
parent 15d0a8be1c
commit 3c27851833
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 4 deletions

View File

@ -488,8 +488,8 @@ class _FocusState extends State<Focus> {
if (widget.skipTraversal != null) {
focusNode.skipTraversal = widget.skipTraversal;
}
if (widget.canRequestFocus != null) {
focusNode.canRequestFocus = widget.canRequestFocus;
if (widget._canRequestFocus != null) {
focusNode.canRequestFocus = widget._canRequestFocus!;
}
_couldRequestFocus = focusNode.canRequestFocus;
_descendantsWereFocusable = focusNode.descendantsAreFocusable;
@ -575,8 +575,8 @@ class _FocusState extends State<Focus> {
if (widget.skipTraversal != null) {
focusNode.skipTraversal = widget.skipTraversal;
}
if (widget.canRequestFocus != null) {
focusNode.canRequestFocus = widget.canRequestFocus;
if (widget._canRequestFocus != null) {
focusNode.canRequestFocus = widget._canRequestFocus!;
}
focusNode.descendantsAreFocusable = widget.descendantsAreFocusable;
}

View File

@ -1925,5 +1925,36 @@ void main() {
final TestSemantics expectedSemantics = TestSemantics.root();
expect(semantics, hasSemantics(expectedSemantics));
});
// Regression test for https://github.com/flutter/flutter/issues/92693
testWidgets('Setting parent FocusScope.canRequestFocus to false, does not set descendant Focus._internalNode._canRequestFocus to false', (WidgetTester tester) async {
final FocusNode childFocusNode = FocusNode(debugLabel: 'node 1');
Widget buildFocusTree({required bool parentCanRequestFocus}) {
return FocusScope(
canRequestFocus: parentCanRequestFocus,
child: Column(
children: <Widget>[
Focus(
focusNode: childFocusNode,
child: Container(),
),
],
),
);
}
// childFocusNode.canRequestFocus is true when parent canRequestFocus is true
await tester.pumpWidget(buildFocusTree(parentCanRequestFocus: true));
expect(childFocusNode.canRequestFocus, isTrue);
// childFocusNode.canRequestFocus is false when parent canRequestFocus is false
await tester.pumpWidget(buildFocusTree(parentCanRequestFocus: false));
expect(childFocusNode.canRequestFocus, isFalse);
// childFocusNode.canRequestFocus is true again when parent canRequestFocus is changed back to true
await tester.pumpWidget(buildFocusTree(parentCanRequestFocus: true));
expect(childFocusNode.canRequestFocus, isTrue);
});
});
}