我已经从RegisteredPatient小部件返回了患者的IC号,但是初始值没有更新和显示。我已经尝试打印患者IC的值,但是我不明白为什么初始值不更新。我什至也尝试过使用setstate。
TextFormField(
initialValue: ic,
validator: (val) => val.isEmpty ? 'Enter patient IC' : null,
decoration: textInputDecoration.copyWith(
hintText: 'Patient IC e.g. 960XXXXXXXXX'
),
onChanged: (val) {
setState(() => ic = val);
},
onTap: () async {
ic = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => RegisteredPatient())
);
},
),
答案 0 :(得分:1)
如果我正确理解了您的问题,那么当您从RegisteredPatient路由返回时,您希望文本字段的值更新。为此,您应该执行以下操作: 声明
TextEditingController _textEditingController = TextEditingController();
在您的TextFormField上
onTap: () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => RegisteredPatient())
).then((newIcValue){
setState(() {
_textEditingController.text = newIcValue;
});
});
},
答案 1 :(得分:1)
TextFormField
的生命周期由其自己的状态(_TextFormFieldState
)在内部进行管理,如果您不提供自己的状态,则该状态将有一个TextEditingController
,并将设置一个{{1 }} 仅 第一次构建窗口小部件并将其插入树中(因此,为该窗口小部件创建initialValue
)。
您可以看一下RenderObject
,看看使用_TextFormFieldState
的地方。
initialValue
这意味着,除非您完全从树中销毁/删除该小部件(例如,通过关闭插入小部件的屏幕),否则它将永远不会更新该值,但您也不需要更新该值,因为创建的 @override
void initState() {
super.initState();
if (widget.controller == null) {
_controller = TextEditingController(text: widget.initialValue);
} else {
widget.controller.addListener(_handleControllerChanged);
}
}
,应将其保留在屏幕上。
这意味着,如果要从已构建的TextEditingController
更新值,则应提供自己的TextFormField
并相应地设置其文本。
TextEditingController