导航到另一个屏幕后,TextField 获得焦点
TextField is gaining focus after navigating to another screen
在我的项目中,我将整个 MaterialApp
包装在一个 GestureDetector
中,当用户点击屏幕时,它应该关闭键盘,使用这段代码
FocusScope.of(context).unfocus()
在测试了多个场景后它不起作用,所以我决定用错误的方式来做
FocusScope.of(context).requestFocus(FocusNode())
但现在我遇到了另一个问题。这是我的简单屏幕代码,由 MaterialApp
的 routes
构建器实例化。
import 'package:flutter/material.dart';
class TestScreen extends StatefulWidget {
@override
_TestScreenState createState() => _TestScreenState();
}
class _TestScreenState extends State<TestScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
TextFormField(),
FlatButton(
onPressed: () => Navigator.push(context,
MaterialPageRoute(builder: (context) => TestScreen())),
child: Text('Test'))
],
),
);
}
}
重现错误的步骤是:1-开始编辑TextField
。 2-通过点击屏幕上的某处取消焦点 TextField
。 3-点击按钮导航到另一个屏幕。这是结果:
当我尝试通过按下键盘的完成按钮来分散注意力 TextField
时,不会发生此行为。根据按下完成按钮时的源代码,TextField
在 TextEditingController
上调用 clearComposing
。我什至尝试过但没有运气。我该如何解决?还有其他人有更好的解决方案来处理 Flutter 中的关闭键盘吗?
这也是我的 flutter doctor
结果:
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.47.3)
[✓] Connected device (2 available)
• No issues found!
搜索了很多关于GitHub焦点管理相关的问题后,似乎没有人知道这样做的正确方法是什么。最后这行代码解决了我的问题:
WidgetsBinding.instance.focusManager.primaryFocus?.unfocus();
我不知道它的副作用,但它现在有效。
您在这里面临两个问题:
flutter 中的预期行为是,当推送到新路由时,先前路由的焦点仍然存在,这意味着当您弹出时 TextField
仍然处于焦点上。请参阅有关该主题的 flutter github 讨论。
您有两个 GestureDetector
被 onTap 指针手势触发。您用来关闭焦点的包装器,以及用于导航到另一条路线的 FlatButton
。当您点击按钮时,底层 GestureRecognizer
将此事件的处理控制权交给按钮,并且包装器 GestureDetector
opTap() 不会被调用(这意味着未调用 unfocus)。
给文本域设置一个focusNode,推送新路由后,聚焦下一个节点,取消聚焦当前节点,如:
// push your new route here
myNode.nextFocus();
myNode.unfocus();
// myNode needs to be the last text field
当您从新路线按回车键时,焦点将不会再自动出现。
对我有用。
在我的项目中,我将整个 MaterialApp
包装在一个 GestureDetector
中,当用户点击屏幕时,它应该关闭键盘,使用这段代码
FocusScope.of(context).unfocus()
在测试了多个场景后它不起作用,所以我决定用错误的方式来做
FocusScope.of(context).requestFocus(FocusNode())
但现在我遇到了另一个问题。这是我的简单屏幕代码,由 MaterialApp
的 routes
构建器实例化。
import 'package:flutter/material.dart';
class TestScreen extends StatefulWidget {
@override
_TestScreenState createState() => _TestScreenState();
}
class _TestScreenState extends State<TestScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
TextFormField(),
FlatButton(
onPressed: () => Navigator.push(context,
MaterialPageRoute(builder: (context) => TestScreen())),
child: Text('Test'))
],
),
);
}
}
重现错误的步骤是:1-开始编辑TextField
。 2-通过点击屏幕上的某处取消焦点 TextField
。 3-点击按钮导航到另一个屏幕。这是结果:
当我尝试通过按下键盘的完成按钮来分散注意力 TextField
时,不会发生此行为。根据按下完成按钮时的源代码,TextField
在 TextEditingController
上调用 clearComposing
。我什至尝试过但没有运气。我该如何解决?还有其他人有更好的解决方案来处理 Flutter 中的关闭键盘吗?
这也是我的 flutter doctor
结果:
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.47.3)
[✓] Connected device (2 available)
• No issues found!
搜索了很多关于GitHub焦点管理相关的问题后,似乎没有人知道这样做的正确方法是什么。最后这行代码解决了我的问题:
WidgetsBinding.instance.focusManager.primaryFocus?.unfocus();
我不知道它的副作用,但它现在有效。
您在这里面临两个问题:
flutter 中的预期行为是,当推送到新路由时,先前路由的焦点仍然存在,这意味着当您弹出时
TextField
仍然处于焦点上。请参阅有关该主题的 flutter github 讨论。您有两个
GestureDetector
被 onTap 指针手势触发。您用来关闭焦点的包装器,以及用于导航到另一条路线的FlatButton
。当您点击按钮时,底层GestureRecognizer
将此事件的处理控制权交给按钮,并且包装器GestureDetector
opTap() 不会被调用(这意味着未调用 unfocus)。
给文本域设置一个focusNode,推送新路由后,聚焦下一个节点,取消聚焦当前节点,如:
// push your new route here
myNode.nextFocus();
myNode.unfocus();
// myNode needs to be the last text field
当您从新路线按回车键时,焦点将不会再自动出现。
对我有用。