Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase TextFormField未重置其初始值_Firebase_Flutter_Dart_Textfield - Fatal编程技术网

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,…)