在我的“ProductScreen”上,我有一个自定义的 TextFiled,其声明如下
Padding(
padding: const EdgeInsets.only(top: Dimensions.m),
child: AppMoneyField(
title: "Value",
initialValue: state.cost,
isMandatory: true,
onTextChange: (value) {
context.read<AddPositionBloc>().add(ChangeCostEvent(double.tryParse(value)));
})),
在AppMoneyField的
initState
上我定义了如何处理initialValue
@override
void initState() {
controller = TextEditingController(
text: widget.initialValue != null
? NumberFormat(".##").format(widget.initialValue)
: "");
super.initState();
}
最初 state.cost 为 null,因此文本字段为空。然后在获取数据后,就会出现新状态。我的问题是,当新状态出现时,它会触发 UI 重建,因为我使用的是
BlocBuilder
,但是 AppMoneyField 中的 initState
没有被调用,只有build
方法被调用,因此 TextField 不会更新。
initState没有被调用正常吗?那我该怎么办?
找到了怎么做,我不得不打电话
didUpdateWidget
void initController() {
controller = TextEditingController(
text: widget.initialValue != null
? NumberFormat(".##").format(widget.initialValue)
: "");
}
@override
void initState() {
super.initState();
initController();
}
@override
void didUpdateWidget(AppMoneyField oldWidget) {
super.didUpdateWidget(oldWidget);
initController();
}