Flutter中TextField意外填充历史值问题求助
问题原因
你遇到的问题是因为ShoppingListDialog在页面初始化时只创建了一次实例,其中的txtName和txtPriority这两个TextEditingController会一直持有之前输入的内容。当你再次打开新增对话框时,没有清空这些控制器的内容,所以会自动填充上次输入的值。
解决方案
下面提供三种可行的解决方法,你可以根据自己的代码习惯选择:
方法一:新增时主动清空控制器内容
在ShoppingListDialog的buildDialog方法中,当isNew为true时,直接清空两个控制器的文本:
Widget buildDialog(BuildContext context, ShoppingList list, bool isNew) { DbHelper helper = DbHelper(); if (isNew) { // 新增时清空输入框内容 txtName.clear(); txtPriority.clear(); } else { txtName.text = list.name; txtPriority.text = list.priority.toString(); } return AlertDialog( // 原有代码保持不变 ); }
方法二:每次打开对话框创建新的Dialog实例
不在initState中提前初始化ShoppingListDialog,而是每次点击按钮时创建新的实例,这样每次的控制器都是全新的:
// 移除main.dart中以下代码: // late ShoppingListDialog dialog; // @override // void initState() { // dialog = ShoppingListDialog(); // super.initState(); // } // 修改floatingActionButton的onPressed逻辑: floatingActionButton: FloatingActionButton( child: Icon(Icons.add), backgroundColor: Colors.pink, onPressed: () { showDialog( context: context, builder: (BuildContext context) => ShoppingListDialog().buildDialog( context, ShoppingList(id: 0, name: '', priority: 0), true), ); }, ),
方法三:将控制器改为局部变量(推荐)
把TextEditingController的创建放到buildDialog方法内部,每次调用方法时生成新的控制器,避免复用旧内容:
class ShoppingListDialog { Widget buildDialog(BuildContext context, ShoppingList list, bool isNew) { DbHelper helper = DbHelper(); // 每次调用方法时创建新的控制器,根据isNew设置初始值 final txtName = TextEditingController(text: isNew ? '' : list.name); final txtPriority = TextEditingController(text: isNew ? '' : list.priority.toString()); return AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)), title: Text((isNew) ? 'New shopping list' : 'Edit shopping list'), content: SingleChildScrollView( child: Column( children: [ TextField( controller: txtName, decoration: InputDecoration(hintText: 'Shopping List Name')), TextField( controller: txtPriority, keyboardType: TextInputType.number, decoration: InputDecoration(hintText: 'Shopping List Priority (1-3)'), ), TextButton( child: Text('Save Shopping List'), onPressed: () { list.name = txtName.text; list.priority = int.parse(txtPriority.text); helper.insertList(list); Navigator.pop(context); }, ), ], ), ), ); } }
内容的提问来源于stack exchange,提问作者Gaurav Singh
相关产品推荐
相关产品推荐

