Flutter 文本字段行为奇怪(使用错误的值更新)

Posted

技术标签:

【中文标题】Flutter 文本字段行为奇怪(使用错误的值更新)【英文标题】:Flutter textfield behaves strange (updating with the wrong value) 【发布时间】:2021-12-29 23:02:18 【问题描述】:

我遇到了与 TextFormField 相关的奇怪行为,因此我在父窗口小部件中维护了一个对象列表,我正在使用以下代码来呈现子窗口小部件列表

 children: <Widget>[
                        ...childProfiles
                            .map((e) => ChildProfileCard(
                                childProfile: e,
                                removeChildProfile: removeChildProfile))
                            .toList(),

而ChildProfileCard包含一个TextFormField,代码如下

TextFormField(
                        decoration: const InputDecoration(
                          contentPadding: EdgeInsets.only(top: 0),
                          hintText: "Enter child's name",
                        ),
                        validator: (value) 
                          if (value == null || value.isEmpty) 
                            return 'Name is required';
                          
                          return null;
                        ,
                      ),

有一个“删除”功能,可以简单地从列表中删除一项,如下所示

setState(() 
      childProfiles = childProfiles
          .where((childProfile) => childProfile.id != childProfileToRemove.id)
          .toList();
    );

当有两个以上项目(两个子小部件)时,我在第一个子小部件的TextFormField中输入了一些文本,然后我删除了第一个项目,文本将始终自动应用到第二个子小部件,是什么做的我做错了吗?我可以确认列表已正确更新,但文本表现异常。

在删除之前,您可以看到我们为不同的小部件设置了不同的文本

删除后,第一个小部件的文本被错误地复制到下一个小部件,您可以看到 uuid 是第二个小部件的。

【问题讨论】:

【参考方案1】:

您应该在构建 ChildProfileCard 时使用任何唯一键

ChildProfileCard(key: Key(<ANY UNIQUE VALUE>),)

例子

ChildProfileCard(key: Key(e.id),)

【讨论】:

以上是关于Flutter 文本字段行为奇怪(使用错误的值更新)的主要内容,如果未能解决你的问题,请参考以下文章

快速访问文本字段的值时出现奇怪的错误

Flutter 自定义键盘(“假”软键盘)

如何在 Flutter 中将 textEditiing 控制器与 Provider 一起使用

Flutter中如何同步两个TextField

Firebase 更新时 Flutter 的错误行为

如何在flutter中通过没有文档ID的用户ID字段更新文档字段的值?