使用 Obx 更改数据时无法更新小部件
Can not update widget when data changed using Obx
这是我的看法
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
flex: 3,
child: Obx(
() => TextFieldWidget(
control: from,
obsure: false,
text: DateFormat('dd-MM-yyyy').format(controller.dateRange.value.start).toString(),
callBackFunc: () async{
controller.showDatePicker();
},
hint: true,),
),
),
const Expanded(flex: 1, child: Icon(Icons.arrow_right_alt)),
Expanded(
flex: 3,
child: Obx(
() => TextFieldWidget(
control: to,
obsure: false,
text: DateFormat('dd-MM-yyyy').format(controller.dateRange.value.end).toString(),
callBackFunc: () async{
controller.showDatePicker();
},
hint: true,),
),
),
//TextFieldWidget(control:to_controller,obsure:false,text:'To'),
],
)};
我的控制器
Future showDatePicker() async{
final NewdateRange = await showDateRangePicker(
context: Get.context!,
firstDate: DateTime(DateTime.now().year-1),
lastDate: DateTime(DateTime.now().year+1),
initialDateRange: dateRange.value,
);
if(NewdateRange != null && NewdateRange != dateRange.value){
dateRange.value = NewdateRange;
update();
}}
我创建的文本字段小部件
Widget build(BuildContext context) {
return TextFormField(
controller: control,
obscureText: obsure,
onTap: callBackFunc,
onChanged: (text) => TextFieldWidget,
style: TextStyle(fontSize: 13),
decoration: InputDecoration(
labelText: text,
hintText: hint?text:'',
border: OutlineInputBorder(),
contentPadding: const EdgeInsets.all(10),
),
)};
我是 flutter 新手,当我在文本字段上切换时,显示了日期选择器,但是当我保存标签文本和提示文本时没有更新新日期我被选择了??对不起我糟糕的英语。请帮帮我!!!
在你提供完整的代码之前,我只能说一个TextField
只有在第一次通过控制器构建时才会改变值,这里TextFieldWidget.text
是在[=时改变的13=] 从 Obx
更改而来,但这不会 re-initialize 您的 TextEditingController
因此 TextField
中的值不会改变。
要解决这个问题,您需要监听变化并在didUpdateWidget
中调用control.text = newText
。
TextFieldWidget
@override
void didUpdateWidget(Widget oldWidget) {
if (oldWidget.text != widget.text) {
control.text = widget.text;
}
}
...
这是我的看法
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
flex: 3,
child: Obx(
() => TextFieldWidget(
control: from,
obsure: false,
text: DateFormat('dd-MM-yyyy').format(controller.dateRange.value.start).toString(),
callBackFunc: () async{
controller.showDatePicker();
},
hint: true,),
),
),
const Expanded(flex: 1, child: Icon(Icons.arrow_right_alt)),
Expanded(
flex: 3,
child: Obx(
() => TextFieldWidget(
control: to,
obsure: false,
text: DateFormat('dd-MM-yyyy').format(controller.dateRange.value.end).toString(),
callBackFunc: () async{
controller.showDatePicker();
},
hint: true,),
),
),
//TextFieldWidget(control:to_controller,obsure:false,text:'To'),
],
)};
我的控制器
Future showDatePicker() async{
final NewdateRange = await showDateRangePicker(
context: Get.context!,
firstDate: DateTime(DateTime.now().year-1),
lastDate: DateTime(DateTime.now().year+1),
initialDateRange: dateRange.value,
);
if(NewdateRange != null && NewdateRange != dateRange.value){
dateRange.value = NewdateRange;
update();
}}
我创建的文本字段小部件
Widget build(BuildContext context) {
return TextFormField(
controller: control,
obscureText: obsure,
onTap: callBackFunc,
onChanged: (text) => TextFieldWidget,
style: TextStyle(fontSize: 13),
decoration: InputDecoration(
labelText: text,
hintText: hint?text:'',
border: OutlineInputBorder(),
contentPadding: const EdgeInsets.all(10),
),
)};
我是 flutter 新手,当我在文本字段上切换时,显示了日期选择器,但是当我保存标签文本和提示文本时没有更新新日期我被选择了??对不起我糟糕的英语。请帮帮我!!!
在你提供完整的代码之前,我只能说一个TextField
只有在第一次通过控制器构建时才会改变值,这里TextFieldWidget.text
是在[=时改变的13=] 从 Obx
更改而来,但这不会 re-initialize 您的 TextEditingController
因此 TextField
中的值不会改变。
要解决这个问题,您需要监听变化并在didUpdateWidget
中调用control.text = newText
。
TextFieldWidget
@override
void didUpdateWidget(Widget oldWidget) {
if (oldWidget.text != widget.text) {
control.text = widget.text;
}
}
...