Flutter TextField输入内容关闭键盘或按返回键消失问题如何解决?
问题根因
你将TextEditingController定义在了State类的build方法内部,键盘收起/弹出、页面切换、系统UI变动等场景都会触发页面重绘,此时build方法会重新执行,生成全新的TextEditingController实例,旧实例保存的输入内容就会丢失。
修复方案
你只需要调整控制器的定义位置,同时补充销毁逻辑即可:
- 将
TextEditingController改为State类的成员变量,在声明时直接初始化即可 - 在State的
dispose生命周期方法中调用控制器的dispose方法释放资源,避免内存泄漏
修改后的登录页面示例代码
class LoginPage extends StatefulWidget { const LoginPage({Key? key}) : super(key: key); @override _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State<LoginPage> { // 移到build方法外作为State类的成员变量 final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); @override void dispose() { // 页面销毁时释放控制器资源 _emailController.dispose(); _passwordController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { double h = MediaQuery.of(context).size.height; return Scaffold( backgroundColor: Colors.white, body: SingleChildScrollView( child: Column( children: <Widget>[ const AuthHeader( firstText: 'Login', secText: 'Sign into your account', flip: false, beginC: Alignment.topRight, endC: Alignment.bottomLeft, caAlignment: CrossAxisAlignment.start, ), SizedBox(height: h * 0.05), TextFieldAuth( controller: _emailController, hintText: 'E-Mail', icon: Icons.mail, ), SizedBox(height: h * 0.03), TextFieldAuth( controller: _passwordController, hintText: 'Password', icon: Icons.password, ), SizedBox(height: h * 0.06), const ButtonAuth( text: 'Sign In', ), SizedBox(height: h * 0.07), AuthRichText( firstText: 'Don\'t have account? ', secText: 'Create', recognizer: TapGestureRecognizer()..onTap = () { Get.toNamed('/signup'); } ), SizedBox(height: h * 0.03), const DividerAuth(), SizedBox(height: h * 0.02), const GroupAuthButton(), ], ), ), ); } }
注册页面按照完全相同的逻辑修改即可,不需要调整自定义TextFieldAuth组件的代码。
内容的提问来源于stack exchange,提问作者Kisah Tegar Putra Abdi
相关产品推荐
相关产品推荐

