颤振:无法更新变量状态

时间:2019-09-28 05:33:25

标签: flutter dart state state-management

在我的应用程序中,有一个添加付款的部分。要添加付款,管理员将:

  1. 选择一个用户
  2. 输入金额
  3. 从日期选择
  4. 选择迄今为止

保存。

目标:我想根据以前的日期动态地更新日期

示例案例:

  1. 我们添加了用户的第一笔付款,从1st June 20191st September 2019
  2. 当我们尝试第二次付款时,选择了客户;我想获得迄今为止作为开始日期的最后一笔付款,并自动填充。 (从窗体到日期从数据库到从日期以表格的形式)

这不能在初始化时完成,因为日期因每个用户而异,所以我们可以根据用户的选择进行操作。

我所做的事情:

我几乎完成了所有工作,但是在更新字段值时遇到了问题。

我已完成以下步骤:

  1. 创建了一个功能,当选择用户时执行该功能
  2. 函数查询数据库,并提取最后的付款明细
  3. 并返回以前付款的迄今为止字段值
  4. 起始日期字段值是在同一函数内设置的,如下所示:

     setState(() {
       _fromDate = DateTime.parse(toDate);
     });
    

问题:

_fromDate函数内部打印setState可打印正确的值,但在null函数外部。

请告诉我,如何正确更新价值并摆脱这个问题?

更新Widget代码如下:(从数据库获取数据后,state的设置如上所述)

DateTimeField(
    onSaved: (val) => setState(() => _fromDate = val),
    keyboardType: TextInputType.datetime,
    onChanged: (DateTime newValue) {
      setState(() {
        _fromDate = newValue;
      });
    },
    onShowPicker: (context, currentValue) {
      return showDatePicker(
          context: context,
          firstDate: DateTime.now(),
          initialDate: currentValue ?? DateTime.now(),
          );
    },
  );

1 个答案:

答案 0 :(得分:2)

使用TextEditingController类来处理运行时文本字段更改。

  

每当用户使用关联的TextEditingController修改文本字段时,该文本字段都会更新值,并且控制器会通知其侦听器。然后,听众可以阅读文本和选择属性,以了解用户键入了什么或如何更新了选择。

此过程非常简单,只需执行以下步骤:

  1. 创建controller

    TextEditingController _fromDateController = new TextEditingController();
    
  2. 像这样将其分配到您的DateTimeField

    DateTimeField(
       ...
       controller: _fromDateController,
    );
    
  3. 更新您字段的onSaved方法:

    DateTimeField(
       ...
       onSaved: (val) => _fromDateController.text = val.toString(),
    );
    
  4. 从数据库获取数据时更新controller

    setState(() {
       _fromDateController.text = toDate;
    }); 
    
  5. 最后,请不要忘记dispose

  

请记住在不再需要TextEditingController时将其丢弃。这将确保我们丢弃该对象使用的所有资源。

    @override
    void dispose() {
       _fromDateController.dispose();
       ...

       super.dispose();
   }

希望有帮助!