Flutter 1.17版本TextField点击后键盘反复开合无法输入问题求助
这种键盘弹起立刻又收回的情况我之前在旧版Flutter里踩过坑,结合你用的1.17版本和已经尝试的组件,大概率是焦点管理异常或者版本固有bug导致的,给你几个针对性的排查和解决方向:
检查焦点节点的初始化方式
很多时候这个问题是因为FocusNode被频繁重建导致的。如果你在build方法里直接创建FocusNode,每次setState或者布局刷新都会生成新的节点,旧焦点丢失就会让键盘收起。正确的做法是在initState里初始化焦点节点,在dispose中释放:class YourPage extends StatefulWidget { @override _YourPageState createState() => _YourPageState(); } class _YourPageState extends State<YourPage> { FocusNode _textFieldFocus; @override void initState() { super.initState(); _textFieldFocus = FocusNode(); } @override void dispose() { _textFieldFocus.dispose(); // 务必释放,避免内存泄漏 super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: TextField( focusNode: _textFieldFocus, // 你的其他配置 ), ), ); } }避免嵌套Scaffold或错误配置resize属性
确保你的页面根组件是单个Scaffold,嵌套多个Scaffold会干扰布局和焦点管理。另外可以显式设置resizeToAvoidBottomInset: true(虽然1.17默认是true,但显式声明有时候能修复布局异常):Scaffold( resizeToAvoidBottomInset: true, body: SingleChildScrollView(...), )手动强制请求焦点
可以在TextField的onTap回调里手动触发焦点请求,强制保留焦点不让键盘收起:TextField( focusNode: _textFieldFocus, onTap: () { // 延迟一点再请求,避免和系统的焦点逻辑冲突 Future.delayed(Duration(milliseconds: 100), () { _textFieldFocus.requestFocus(); }); }, )考虑升级Flutter版本
Flutter 1.17是比较老旧的版本了,这个版本确实存在不少和TextField焦点、键盘交互相关的已知bug。如果项目兼容性允许,建议升级到2.x或3.x的稳定版,很多这类问题在后续版本里已经被修复了。升级前记得备份代码,做好兼容性测试。检查父布局的约束问题
如果TextField所在的父组件有固定高度或者约束过死,当键盘弹起时页面resize会导致组件重新布局,进而丢失焦点。确保SingleChildScrollView的父组件没有设置固定高度,或者用Expanded、Flex这类弹性布局给TextField足够的适配空间。
内容的提问来源于stack exchange,提问作者sajjad hajizadeh

