在我的项目中,我将整个MaterialApp
包裹在GestureDetector
中,该代码应该在用户使用此代码敲击屏幕时关闭键盘
FocusScope.of(context).unfocus()
在测试了多种情况后,它无法正常工作,所以我决定以错误的方式进行操作
FocusScope.of(context).requestFocus(FocusNode())
但是现在我遇到另一个问题。这是我的简单屏幕代码,由MaterialApp
的{{1}}构建器实例化。
routes
重现错误的步骤是:1-开始编辑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'))
],
),
);
}
}
。通过点击屏幕上的某处,使2 TextField
失去焦点。 3点击按钮导航到另一个屏幕。结果是:
当我尝试通过按键盘的“完成”按钮使TextField
失去焦点时,不会发生此行为。根据源代码,当按下“完成”按钮时,TextField
在TextField
上调用clearComposing
。我什至尝试过但没有运气。我该如何解决?还有其他人有更好的解决方案来处理Flutter中的关闭键盘吗?
这也是我的TextEditingController
结果:
flutter doctor
答案 0 :(得分:0)
在GitHub上搜索了大量与焦点管理相关的问题之后,似乎没人知道正确的方法是什么。最终,这行代码解决了我的问题:
WidgetsBinding.instance.focusManager.primaryFocus?.unfocus();
我尚不知道它的副作用,但是它现在正在起作用。
答案 1 :(得分:0)
您在这里面临两个问题:
在颤动中的预期行为是当推到新路径时,先前路径的焦点仍然存在,这意味着当您弹出TextField
时仍会保持焦点。请参阅关于主题的flutter github讨论。
您有两个GestureDetector
,它们通过 onTap 指针手势进行调整。您用来关闭焦点的包装器,以及FlatButton
用来导航到另一条路线的包装器。当您点击按钮时,底层的GestureRecognizer
将对此事件的处理控制权交给按钮,并且包装器GestureDetector
opTap()不会被调用(这意味着未聚焦)