首页 > 解决方案 > Flutter:无法更新变量状态

问题描述

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

  1. 选择一个用户
  2. 输入金额
  3. 从日期中选择
  4. 选择日期

并保存它。

目标:我想根据上一个日期动态更新日期

示例案例:

  1. 我们添加了用户的第一笔付款,从1st June 20191st September 2019
  2. 当我们尝试进行第二次付款时,当客户被选中时;我想从 date获得最后一次付款,自动填充。(日期从分贝到表格中的日期

它不能在初始化时完成,因为每个用户的日期不同,所以我们可以在用户选择时进行。

我做了什么:

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

我已经完成了这些步骤:

  1. 创建了一个函数,当用户被选中时执行
  2. 函数查询数据库,并提取最后的付款明细
  3. 并返回上一次付款的日期字段值
  4. 起始日期字段值在同一函数中设置,如下所示:

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

问题:

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

请告诉我,我怎样才能正确更新价值并摆脱这个问题?

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

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

标签: flutterdartstatestate-management

解决方案


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

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

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

  1. 创建controller

    TextEditingController _fromDateController = new TextEditingController();
    
  2. 像这样分配给你DateTimeField

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

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

    setState(() {
       _fromDateController.text = toDate;
    }); 
    
  5. 最后,别忘了dispose

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

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

       super.dispose();
   }

希望能帮助到你!


推荐阅读