Firebase TextFormField未重置其初始值
我对Firebase TextFormField未重置其初始值,firebase,flutter,dart,textfield,Firebase,Flutter,Dart,Textfield,我对flatter有些陌生,所以我不知道这是否是更新从服务器收集的数据的“正确”方法。就我而言,我正在做的是(我的应用程序代码很长,我想下面的描述就足够了): 让用户为给定日期创建自定义表单 让他将数据上传到服务器(更具体地说,Firebase) 如果他点击某个日期,表单应更新为保存在Firebase上的最新表单。 为此,我删除了所有TextFormField小部件(它们保存在Map中,我用widgetsMap={}重置,这也是我对表单数据本身所做的),并用从Firebase检索到的数据重建它
flatter
有些陌生,所以我不知道这是否是更新从服务器收集的数据的“正确”方法。就我而言,我正在做的是(我的应用程序代码很长,我想下面的描述就足够了):
Firebase
)Firebase
上的最新表单。
- 为此,我删除了所有
小部件(它们保存在TextFormField
中,我用Map
重置,这也是我对表单数据本身所做的),并用从widgetsMap={}
检索到的数据重建它们Firebase
应具有基于从TextFormField
检索到的内容的初始值。为了实现这一点,我尝试使用Firebase
和控制器
,但两者都不起作用。初始值
- 问题是,如果我想再次更新字段的初始值,则前一个字段将保留。例如,如果
的初始值为date1
,Hello
的初始值为date2
;当我点击来自World
的date1
时,虽然date2
小部件(甚至可能有不同数量)将正确构建,但显示的初始值仍然是TextFormField
Hello
- 问题是,如果我想再次更新字段的初始值,则前一个字段将保留。例如,如果
那么发生了什么?当小部件和数据被重置后,小部件的
initialValue
不应该被删除吗?即使在我用={}
重置它们之后,这些对象是否仍然存在于背景中的某个地方(我认为,由于dart
是一种垃圾收集语言,一旦对它们的引用消失,这些对象就会被删除…)将键添加到TextFormField
。您可以使用键(初始值)
。例如:
TextFormField(
key:key(widget.initialValue),
initialValue:widget.initialValue),
...
)
尽管您重置了自己的TextFormField
s映射,但如果您将新的TextFormField
s放置在小部件树中的相同位置,那么flift
框架将重用以前的状态。设置键
将告诉flatter
这是一个不同的小部件。您的意思是类似于final\u formKey=GlobalKey()
?我试图将所有TextFormField
包装在表单中,然后在initState
中调用\u formKey.currentState.reset()
,但似乎不起作用。这就是你所说的吗?这不应该是TextFormField
的一个bug吗?我认为flatter
小部件应该在build
方法中完全重建,并且没有任何对以前小部件的引用。无状态小部件每次都会重建。StatefulWidget的状态不是。它被持久化以明显地保持状态,而TextFormField是StatefulWidget。如果在StatefulWidget上放置相同的类型,则将重用widget树中相同位置的状态。是的,但只有在我没有删除StatefulWidget
的情况下,我才期望出现这种行为。在我的例子中,每次我必须通过Firebase
进行更新时,我都会删除StatefulWidget
(widgetsMap={}
)。如果假设它们不再存在,那么之前的状态在哪里被跟踪?如果我故意删除它,它真的应该被跟踪吗?我很难在没有看到代码和你具体做什么的情况下告诉你更多。你能粘贴一些代码吗?@FilipP,你为什么删除以前的答案?我刚刚测试过它,它看起来确实有效。我现在使用的是键
和初始值
。所以它应该是这样的:TextFormField(key:key(widget.initialValue),initialValue:widget.initialValue,…)
。