在我的应用程序中,有一个添加付款的部分。要添加付款,管理员将:
保存。
目标:我想根据以前的日期动态地更新日期。
示例案例:
1st June 2019
到1st September 2019
这不能在初始化时完成,因为日期因每个用户而异,所以我们可以根据用户的选择进行操作。
我所做的事情:
我几乎完成了所有工作,但是在更新字段值时遇到了问题。
我已完成以下步骤:
起始日期字段值是在同一函数内设置的,如下所示:
setState(() {
_fromDate = DateTime.parse(toDate);
});
问题:
在_fromDate
函数内部打印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(),
);
},
);
答案 0 :(得分:2)
使用TextEditingController类来处理运行时文本字段更改。
每当用户使用关联的TextEditingController修改文本字段时,该文本字段都会更新值,并且控制器会通知其侦听器。然后,听众可以阅读文本和选择属性,以了解用户键入了什么或如何更新了选择。
此过程非常简单,只需执行以下步骤:
创建controller
:
TextEditingController _fromDateController = new TextEditingController();
像这样将其分配到您的DateTimeField
:
DateTimeField(
...
controller: _fromDateController,
);
更新您字段的onSaved
方法:
DateTimeField(
...
onSaved: (val) => _fromDateController.text = val.toString(),
);
从数据库获取数据时更新controller
:
setState(() {
_fromDateController.text = toDate;
});
最后,请不要忘记dispose
:
请记住在不再需要TextEditingController时将其丢弃。这将确保我们丢弃该对象使用的所有资源。
@override
void dispose() {
_fromDateController.dispose();
...
super.dispose();
}
希望有帮助!