Flutter:无法更新变量状态
Flutter: Unable to update variable state
在我的应用程序中,有一个部分用于添加付款。要添加付款,管理员将:
- select一个用户
- 输入金额
- select日期
- select至今
并保存。
目标: 我想根据之前的日期从日期动态更新。
示例案例:
- 我们添加了用户的首次付款,从
1st June 2019
到 1st September 2019
- 当我们尝试进行第二次付款时,当客户 selected 时;我想获得最后一笔付款 到日期 作为 从日期 自动填充。 (到日期从数据库到从日期在表格中)
不能在初始化时完成,因为每个用户的日期不同,所以我们可以在用户selection.
我做了什么:
我几乎完成了所有操作,但在更新字段值时遇到问题。
我已经完成了这些步骤:
- 创建了一个函数,当用户 selected
时执行
- 函数查询数据库,并提取最后的付款明细
- and returns to date 以前付款的字段值
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.
过程非常简单,只需按照以下步骤操作即可:
创建controller
:
TextEditingController _fromDateController = new TextEditingController();
像这样将其分配给您的 DateTimeField
:
DateTimeField(
...
controller: _fromDateController,
);
更新您字段的 onSaved
方法:
DateTimeField(
...
onSaved: (val) => _fromDateController.text = val.toString(),
);
当您从 db:
获取数据时更新 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();
}
希望对您有所帮助!
在我的应用程序中,有一个部分用于添加付款。要添加付款,管理员将:
- select一个用户
- 输入金额
- select日期
- select至今
并保存。
目标: 我想根据之前的日期从日期动态更新。
示例案例:
- 我们添加了用户的首次付款,从
1st June 2019
到1st September 2019
- 当我们尝试进行第二次付款时,当客户 selected 时;我想获得最后一笔付款 到日期 作为 从日期 自动填充。 (到日期从数据库到从日期在表格中)
不能在初始化时完成,因为每个用户的日期不同,所以我们可以在用户selection.
我做了什么:
我几乎完成了所有操作,但在更新字段值时遇到问题。
我已经完成了这些步骤:
- 创建了一个函数,当用户 selected 时执行
- 函数查询数据库,并提取最后的付款明细
- and returns to date 以前付款的字段值
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.
过程非常简单,只需按照以下步骤操作即可:
创建
controller
:TextEditingController _fromDateController = new TextEditingController();
像这样将其分配给您的
DateTimeField
:DateTimeField( ... controller: _fromDateController, );
更新您字段的
onSaved
方法:DateTimeField( ... onSaved: (val) => _fromDateController.text = val.toString(), );
当您从 db:
获取数据时更新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();
}
希望对您有所帮助!