Flutter的TextFormField在重建时未更新值

8
我尝试使编辑字符串列表成为可能。问题是,当我通过 IconButton 删除列表项时,TextField 会重新构建,但却仍然带有旧值。通过调试,我发现我的字符串列表确实已正确更新,这意味着已在列表中删除了该字符串。
以下是我的代码:
class EditInfoItemDialog extends StatefulWidget {

  @override
  State<StatefulWidget> createState() => _EditInfoitemDialogState();
}

class _EditInfoitemDialogState extends State<EditInfoItemDialog> {

  final _formKey = GlobalKey<FormState>();
  List<String> values = ['A', 'B', 'C'];

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: Container(
        width: MediaQuery.of(context).size.width,
        child: Column(
          children: <Widget>[
            ...values.asMap().map((int index, String point) {
              return MapEntry(index, Row(
                children: [
                  Text(index.toString()),
                  Expanded(
                    child: TextFormField(
                      decoration: InputDecoration(hintText: 'Info'),
                      initialValue: values[index],
                      onChanged: (value) => setState(() {values[index] = value; }),
                    ),
                  ),
                  IconButton(
                    icon: Icon(Icons.delete),
                    color: Colors.red,
                    onPressed: () {
                      setState(() {
                        values.removeAt(index);
                        print(values);
                      });
                    },
                  )
                ]
              ));
            }).values.toList(),
            FlatButton(
              child: Text('Add Bulletpoint'),
              onPressed: () {
                setState(() {
                  if (values == null) values = [];
                  values.add('');
                });
              },
            )
          ],
        ),
      ),
    );

  }

有什么想法吗?
1个回答

14

您需要像这样向您的TextFormField添加一个键:

key: ObjectKey(values[index])

这里是一个解释,以及一个例子,说明为什么在这种情况下需要添加一个key: 无状态组件类中的键是什么?

在识别列表中哪个部件发生了更改时,关键是Flutter引擎使用的内容

更多信息: 关键属性


好的,我已经修复了。我不应该在TextField的onChange事件中使用setState - Jonas
如果两个小部件具有相同的键,这是否是一个问题?如果我有两个TextFormField并且有人输入相同的值呢? - Chris
好的,我刚刚检查了一下。由于“如果多个带关键字的节点作为另一个节点的子节点存在,则它们必须具有唯一的关键字”,因此我无法使用两个相同的关键字。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接