【问题标题】:TextFormField not resetting its Initial ValueTextFormField 未重置其初始值
【发布时间】:2019-11-05 16:04:32
【问题描述】:

我对@9​​87654321@ 有点陌生,所以我不知道这是否是更新从服务器收集的数据的“正确”方式。就我而言,我正在做的是(我的应用程序代码很长,我认为下面的描述就足够了):

  1. 让用户为给定日期创建自定义表单。
  2. 让他将数据上传到服务器(更具体地说,Firebase)。
  3. 如果他点击一个日期,表格应该更新为Firebase 上保存的最新表格。
    • 为此,我将删除所有TextFormField 小部件(它们保存在Map 中,我用widgetsMap = {} 重置,这也是我为表单数据本身所做的)并重建它们使用从 Firebase 检索到的数据。
    • TextFormField 的初始值应基于从Firebase 检索到的内容。为此,我尝试使用controllerinitialValue,但都没有奏效。
      • 问题是,如果我想第二次更新一个字段的初始值,前一个将保留。例如,如果date 1 的初始值为Hello,而date 2 的初始值为World;当我点击来自date 1date 2 时,虽然TextFormField 小部件(甚至可能有不同数量)将正确构建,但显示的初始值仍将是Hello

那么发生了什么?一旦小部件和数据被重置,小部件的initialValue 不应该被清除吗?即使在我使用= {} 重置它们之后,这些对象是否仍然存在于后台某处(我认为,由于dart 是一种垃圾收集语言,一旦对它们的引用消失,这些对象就会被删除......) ?

【问题讨论】:

  • 你能粘贴一些代码吗?
  • @FilipP。 ,你为什么删除你之前的答案?我刚刚对其进行了测试,它似乎确实有效。我现在同时使用keyinitialValue。所以它会是这样的:TextFormField(key: Key(widget.initialValue), initialValue: widget.initialValue, ...).

标签: firebase flutter dart textfield


【解决方案1】:

Key 添加到TextFormField。您可以使用Key(initialValue)。例如:

TextFormField(
  key: Key(widget.initialValue),
  initialValue: widget.initialValue),
  ...
)

虽然您重置了自己的TextFormFields 映射,但如果您将新的TextFormFields 放在小部件树中的相同位置,Flutter 框架将重用以前的状态。设置Key 将告诉Flutter 这是一个不同的小部件。

【讨论】:

  • 你的意思是像final _formKey = GlobalKey<FormState>()这样的东西吗?我尝试将所有TextFormFields 包装在Form 中,然后在initState 中调用_formKey.currentState.reset(),但它似乎没有用。你说的是这个吗?
  • 这不应该是TextFormField 的一个错误吗?我认为Flutter 小部件应该在build 方法中完全重建,并且没有对以前的小部件有任何引用。
  • 无状态小部件每次都会重建。 StatefulWidget 的状态不是。它坚持显然保持状态,TextFormField 是 StatefulWidget。如果你把相同的类型放在 StatefulWidget 的相同位置,widget 树状态会被重用。 api.flutter.dev/flutter/widgets/StatefulWidget-class.html
  • 是的,但是只有在我没有删除 StatefulWidget 的情况下,我才期望这种行为。就我而言,每次我必须通过Firebase 进行更新时,我都会删除StatefulWidget (widgetsMap = {})。如果它们应该不再存在,那么之前的状态在哪里被跟踪?如果我故意删除它真的应该被跟踪吗?
  • 如果没有看到代码和您的具体操作,我很难告诉您更多信息。
猜你喜欢
  • 2021-04-01
  • 2021-06-19
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多