Flutter:无法更新变量状态

Flutter: Unable to update variable state

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

  1. select一个用户
  2. 输入金额
  3. select日期
  4. select至今

并保存。

目标: 我想根据之前的日期从日期动态更新

示例案例:

  1. 我们添加了用户的首次付款,从 1st June 20191st September 2019
  2. 当我们尝试进行第二次付款时,当客户 selected 时;我想获得最后一笔付款 到日期 作为 从日期 自动填充。 (到日期从数据库到从日期在表格中)

不能在初始化时完成,因为每个用户的日期不同,所以我们可以在用户selection.

我做了什么:

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

我已经完成了这些步骤:

  1. 创建了一个函数,当用户 selected
  2. 时执行
  3. 函数查询数据库,并提取最后的付款明细
  4. and returns to date 以前付款的字段值
  5. from date 字段值在同一个函数中设置如下:

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

问题:

Printing _fromDate inside 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(),
          );
    },
  );

使用TextEditingController class 处理运行 时间文本字段更改。

Whenever the user modifies a text field with an associated TextEditingController, the text field updates value and the controller notifies its listeners. Listeners can then read the text and selection properties to learn what the user has typed or how the selection has been updated.

过程非常简单,只需按照以下步骤操作即可:

  1. 创建controller:

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

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

    DateTimeField(
       ...
       onSaved: (val) => _fromDateController.text = val.toString(),
    );
    
  4. 当您从 db:

    获取数据时更新 controller
    setState(() {
       _fromDateController.text = toDate;
    }); 
    
  5. 最后,别忘了dispose它:

Remember to dispose of the TextEditingController when it is no longer needed. This will ensure we discard any resources used by the object.

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

       super.dispose();
   }

希望对您有所帮助!