Flutter中点击键盘确认/关闭时TextFormField内容重置问题
问题原因
每次build方法执行时(比如关闭键盘触发UI重绘),FutureBuilder的builder都会重新执行,而你在ListView.builder的itemBuilder里反复给TextEditingController设置数据库初始值,覆盖了用户编辑后的内容。
解决方案
只在第一次获取到数据库数据时给控制器赋值,避免每次build都重置内容。可以通过添加一个状态变量标记是否已完成初始赋值来实现。
修改后的代码示例
final Correo = TextEditingController(); final NombreUsuario = TextEditingController(); // 标记变量:记录控制器是否已完成初始赋值 bool _isControllerInitialized = false; Widget FullName(nombreusuario){ return Container( child: TextFormField( controller: nombreusuario, validator:(value){ if(value.isEmpty){ return "El nombre del usuario no pued quedar vacío"; }else if(value.length < 1 || value.length > 50){ // 修正原逻辑错误:将&&改为|| return "El nombre es muy corto o muy largo"; } return null; }, decoration: InputDecoration( icon: Icon(Icons.account_circle), labelText: 'Nombre de usuario', suffixIcon: IconButton( icon: Icon(Icons.cancel,color: Colors.black,), onPressed: () { nombreusuario.clear(); } ) ), ), ); } @override void initState() { fup = editarperfilservices.EditarPerfil(); super.initState(); } @override Widget build(BuildContext context) { return FutureBuilder( future: fup, builder:(context, AsyncSnapshot snapshot) { if(snapshot.hasData ) { List busqueda = snapshot.data; // 仅第一次获取数据时初始化控制器 if(!_isControllerInitialized && busqueda.isNotEmpty){ Correo.text = busqueda[0].UsuarioCorreo ; NombreUsuario.text = busqueda[0].UsuarioApodo ; _isControllerInitialized = true; } return Center( child: Container( padding: EdgeInsets.only(left: 16, right: 16), // 补充原代码缺失的padding参数 child: ListView.builder( itemCount: busqueda.length, itemBuilder: (context,i){ // 移除此处重复赋值控制器的代码 return Container( child: ListView( shrinkWrap: true, children:[ SizedBox(height: 18,), FullName(NombreUsuario), SizedBox(height: 18,), CorreoF2(Correo), ] ), ); } ) ) ); }else if(snapshot.hasError){ return Text("${snapshot.error}"); } return Center(child: CircularProgressIndicator()); } ); }
额外优化提示
- 原代码中
validator的长度判断逻辑错误:value.length < 1 && value.length > 50永远无法成立,已修正为value.length < 1 || value.length > 50。 - 如果
busqueda列表仅存储当前用户的单条信息,可直接使用busqueda[0]获取数据,无需通过ListView.builder遍历,进一步简化布局。
内容的提问来源于stack exchange,提问作者Carlos Alejandro
相关产品推荐
相关产品推荐

