flutter - Flutter:无法更新变量状态

标签 flutter dart state state-management

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

  • 选择一个用户
  • 输入金额
  • 从日期选择
  • 选择以添加日期

  • 并保存。

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

    示例案例:
  • 我们添加了用户的首次付款,从1st June 20191st September 2019
  • ,当我们尝试第二次付款时,选择了客户;我想获取日期为的最后一笔付款,日期为,日期为,自动填充。 (将db的日期从数据库更新为的日期,以表格的形式)

  • 初始化时无法完成此操作,因为日期因每个用户而异,因此我们可以根据用户的选择进行操作。

    我已完成的操作:

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

    我已经完成以下步骤:
  • 创建了一个函数,当用户被选中时执行该函数
  • 函数查询数据库,并提取最后的付款明细
  • 并返回至今的日期先前付款的字段值
  • 从日期字段开始的字段值是在同一函数内设置的,如下所示:
     setState(() {
       _fromDate = DateTime.parse(toDate);
     });
    

  • 问题:

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

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

    更新: 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类处理运行时文本字段更改。

    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.



    该过程非常简单,只需遵循以下步骤:
  • 创建controller:
    TextEditingController _fromDateController = new TextEditingController();
    
  • 像这样将其分配给您的DateTimeField:
    DateTimeField(
       ...
       controller: _fromDateController,
    );
    
  • 更新您的字段的onSaved方法:
    DateTimeField(
       ...
       onSaved: (val) => _fromDateController.text = val.toString(),
    );
    
  • 从数据库获取数据时更新controller:
    setState(() {
       _fromDateController.text = toDate;
    }); 
    
  • 最后,不要忘记对其进行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();
       }
    

    希望能帮助到你!

    关于flutter - Flutter:无法更新变量状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143655/

    相关文章:

    flutter - 使用 ScaffoldMessenger 显示自定义小部件

    Flutter AnimatedSize 仅适用于一个方向

    flutter - 使用Provider是否意味着没有Stateful Widgets?

    flutter - 如何根据父级的大小布局小部件?

    flutter - 在同一页面中使用两个 BLoC 并在第二个 BLoC 中传递第一个 BLoC 的状态

    javascript - 根据状态更改按钮的类名无法正常工作

    delphi - 检测是拖到我的应用程序上的东西

    Flutter FloatingActionButton 和 IconButton

    Flutter 自动路由 : How to set initial route programmatically?

    dart - 如何让 Stack 小部件将自身限制为 Flutter 中的 Positioned 子部件?