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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:45:17