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
相关产品推荐
相关产品推荐

