Flutter AlertDialog中TextField取消操作仍保存修改问题求助
问题解决:AlertDialog中TextField取消/背景关闭仍保存内容的问题
你的问题核心在于用onChanged实时修改外部变量newValue——只要用户在输入框中输入过内容,不管是点击取消按钮还是点击背景关闭弹窗,newValue都会被更新,弹窗关闭后的非空判断自然会触发数据更新操作。
修改后的代码
Future<void> editField(String field) async { final result = await showDialog<String>( context: context, builder: (context) { String inputValue = ''; return AlertDialog( backgroundColor: Colors.grey[100], title: Text( "Edit $field", style: const TextStyle(color: Colors.black), ), content: TextField( autofocus: true, style: const TextStyle(color: Colors.black), decoration: InputDecoration( hintText: "Enter new $field", hintStyle: const TextStyle(color: Colors.grey), ), onChanged: (value) { inputValue = value; }, ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Cancel'), ), TextButton( onPressed: () => Navigator.of(context).pop(inputValue), child: const Text('Submit'), ), ], ); }, ); if (result?.trim().isNotEmpty ?? false) { await userCollection.doc(currentUser.email).update({field: result!.trim()}); } }
关键改动说明
- 用弹窗内部变量存储输入:在
builder内部定义inputValue,避免外部变量被实时修改,只有点击提交时才会把值返回出去 - 依赖
showDialog返回值判断操作:取消按钮和背景关闭弹窗时,Navigator.pop不带参数,返回null;只有点击提交时才返回输入内容 - 严格的更新判断:仅当返回值
result存在且非空白时,才执行数据库更新操作
内容的提问来源于stack exchange,提问作者ボロボロ
相关产品推荐
相关产品推荐

