导航到另一个屏幕后,TextField获得焦点

时间:2020-08-07 07:54:58

标签: flutter dart keyboard

在我的项目中,我将整个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点击按钮导航到另一个屏幕。结果是:

enter image description here

当我尝试通过按键盘的“完成”按钮使TextField失去焦点时,不会发生此行为。根据源代码,当按下“完成”按钮时,TextFieldTextField上调用clearComposing。我什至尝试过但没有运气。我该如何解决?还有其他人有更好的解决方案来处理Flutter中的关闭键盘吗?

这也是我的TextEditingController结果:

flutter doctor

2 个答案:

答案 0 :(得分:0)

在GitHub上搜索了大量与焦点管理相关的问题之后,似乎没人知道正确的方法是什么。最终,这行代码解决了我的问题:

WidgetsBinding.instance.focusManager.primaryFocus?.unfocus();

我尚不知道它的副作用,但是它现在正在起作用。

答案 1 :(得分:0)

您在这里面临两个问题:

  1. 在颤动中的预期行为是当推到新路径时,先前路径的焦点仍然存在,这意味着当您弹出TextField时仍会保持焦点。请参阅关于主题的flutter github讨论。

  2. 您有两个GestureDetector,它们通过 onTap 指针手势进行调整。您用来关闭焦点的包装器,以及FlatButton用来导航到另一条路线的包装器。当您点击按钮时,底层的GestureRecognizer将对此事件的处理控制权交给按钮,并且包装器GestureDetector opTap()不会被调用(这意味着未聚焦)