Flutter TextField点击后键盘弹出1秒即消失问题求助
Flutter TextField键盘弹出后立即收回的解决方案
你的代码存在两个核心问题,直接导致了键盘弹出后迅速收回的现象:
Get.put(SignUpController())写在build方法内部,每次Widget重建时都会重新注入新的控制器实例,触发Widget树重构,让TextField失去焦点,键盘随之收起。GlobalKey<FormState> _formkey同样定义在build方法内,每次build都会生成新的Key,Form状态被强制重置,间接引发焦点丢失。
修复步骤:
将控制器初始化移至build方法外
根据Widget类型选择合适的初始化方式,避免每次build都重新注入控制器:- 若为StatefulWidget:
class SignUpPage extends StatefulWidget { const SignUpPage({super.key}); @override State<SignUpPage> createState() => _SignUpPageState(); } class _SignUpPageState extends State<SignUpPage> { late final SignUpController controller; final _formkey = GlobalKey<FormState>(); @override void initState() { super.initState(); controller = Get.put(SignUpController()); } @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.symmetric(vertical: tFormHeight - 10), child: Form( key: _formkey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // 原有的TextFormField及按钮代码... ], ), ), ); } } - 若为StatelessWidget:
class SignUpPage extends StatelessWidget { SignUpPage({super.key}); final controller = Get.put(SignUpController()); final _formkey = GlobalKey<FormState>(); @override Widget build(BuildContext context) { // 原有的build内容... } }
- 若为StatefulWidget:
固定GlobalKey的声明位置
将_formkey作为Widget类的成员变量,确保整个Widget生命周期内Key唯一,不会因build触发而重置Form状态。排查额外重建触发点
- 检查父Widget是否存在不必要的
setState调用,导致当前Widget频繁重构。 - 确认SignUpController中是否有意外触发的
update()方法,引发依赖该控制器的Widget强制刷新。
- 检查父Widget是否存在不必要的
内容的提问来源于stack exchange,提问作者HELL unknown
相关产品推荐
相关产品推荐

