【问题标题】:Flutter: Unable to update variable stateFlutter:无法更新变量状态
【发布时间】:2019-10-01 14:25:39
【问题描述】:

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

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

然后保存。

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

示例:

  1. 我们添加了用户的首次付款,从1st June 20191st September 2019
  2. 当我们尝试进行第二次付款时,当客户被选中时;我想将最后一次付款to date设为from date,自动填充。 (to date 从 db 到 from date 形式)

初始化时不能做,因为每个用户的日期都不一样,所以我们可以根据用户的选择来做。

我做了什么:

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

我已完成以下步骤:

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

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

问题:

setState 函数内部打印 _fromDate 会打印正确的值,但在外部是 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(),
          );
    },
  );

【问题讨论】:

  • 你能添加小部件的代码来看看你是如何初始化和使用_fromDate的吗?
  • @KirillMatrosov 我已经更新了问题,请检查...
  • 您没有将format 指向DateTimeFieldlastDate 指向showDatePicker。此代码无效。请检查,也许这是问题
  • 通过添加format: DateFormat("yyyy-MM-dd"),lastDate: DateTime.now().add(new Duration(days: 30)) 更新了代码,但仍然是同样的问题...

标签: flutter dart state state-management


【解决方案1】:

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

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

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

  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它:

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

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

       super.dispose();
   }

希望对你有帮助!

【讨论】:

  • 感谢您的回答,我会尝试并回复您!
  • 非常感谢,它工作但它显示日期+时间,我只需要显示日期(Year / Month / Day)。我该怎么做?
  • 试试这个代码来格式化日期:DateFormat('yyyy/MM/dd').format(DateTime.parse(DATE_STRING))
猜你喜欢
  • 2021-12-10
  • 2020-04-28
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多