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

Dart中SharedPreferences实现的‘记住我’邮箱填充功能失效求助

问题分析

你的代码已成功从SharedPreferences读取到邮箱地址,但TextFormField始终为空,核心原因是**initialValue仅在TextFormField第一次构建时生效**。_loadLoginInfo是异步方法,组件完成初始build后它才会执行完毕并更新_email,此时TextFormField不会重新读取initialValue,因此无法显示加载后的邮箱。

解决方案

改用TextEditingController控制输入框内容,它支持动态更新文本,完美适配异步加载场景:

1. 定义邮箱输入控制器

在State类中添加TextEditingController:

final TextEditingController _emailController = TextEditingController();
var _email;
var _password;
var _rememberMe = false;

2. 修改加载登录信息的方法

加载完成后直接更新控制器的文本内容:

Future<void> _loadLoginInfo() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  setState(() {
    _rememberMe = prefs.getBool('rememberMe') ?? false;
    if (_rememberMe) {
      final savedEmail = prefs.getString('email') ?? '';
      print('loaded');
      print(savedEmail);
      _email = savedEmail;
      _emailController.text = savedEmail; // 动态更新输入框内容
    } else {
      _emailController.clear(); // 未勾选"记住我"时清空输入框
    }
  });
}

3. 更新TextFormField配置

移除initialValue,绑定控制器:

TextFormField(
  controller: _emailController, // 绑定控制器
  decoration: InputDecoration(
    hintText: 'Email',
    border: OutlineInputBorder(),
  ),
  validator: (value) {
    if (value == null || value.isEmpty) {
      return 'Please enter your email';
    }
    return null;
  },
  onSaved: (value) {
    _email = value;
  },
)

4. 释放控制器资源(可选但推荐)

在组件销毁时释放控制器,避免内存泄漏:

@override
void dispose() {
  _emailController.dispose();
  super.dispose();
}

额外检查:确保表单值正确保存

登录时要先调用Form的save方法,触发onSaved更新_email,否则_saveLoginInfo中的_email可能不是最新输入值:

// 假设你有一个FormKey
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

// 登录按钮逻辑
ElevatedButton(
  onPressed: () {
    if (_formKey.currentState?.validate() ?? false) {
      _formKey.currentState?.save(); // 先保存表单值到_email
      if (_rememberMe) {
        print(_email);
        _saveLoginInfo();
      }
      // 执行登录逻辑
    }
  },
  child: const Text('登录'),
)

这样修改后,下次进入登录页面时,异步加载完成后输入框会自动填充保存的邮箱,即使重启应用也能正常生效。

内容的提问来源于stack exchange,提问作者Hssum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:37:47