You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:04