firebase - 为什么初始值不更新和显示?
问题描述
我已从 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())
);
},
),
解决方案
TextFormField
的生命周期由它自己的状态 ( ) 在内部管理,_TextFormFieldState
如果TextEditingController
您不提供自己的状态,它将设置)。initialValue
RenderObject
您可以查看_TextFormFieldState
并查看initialValue
使用的位置。
@override
void initState() {
super.initState();
if (widget.controller == null) {
_controller = TextEditingController(text: widget.initialValue);
} else {
widget.controller.addListener(_handleControllerChanged);
}
}
这意味着,除非您从树中完全销毁/删除该小部件(例如,通过关闭插入它的屏幕),否则它永远不会更新该值,但您也不应该需要,因为 createdTextEditingController
应该保持在屏幕上。
这意味着,如果您想更新TextFormField
已经构建的值,您应该提供自己的值TextEditingController
并相应地设置它的文本。
TextEditingController _controller;
void initState(){
_controller = TextEditingController(text: ic);
}
void build(BuildContext context) {
return TextFormField(
controller: _controller,
validator: (val) => val.isEmpty ? 'Enter patient IC' : null,
decoration: textInputDecoration.copyWith(
hintText: 'Patient IC e.g. 960XXXXXXXXX'
),
onTap: () async {
final String value = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => RegisteredPatient())
);
setState(() => _controller.text = value);
},
),
}
推荐阅读
- powershell - 如何在powershell中的-Newname中包含变量
- mysql - 使用 MySQL 的 C# 中的 IF & Else 条件
- scatter-plot - 两张图片之间的散点图 Google Earth Engine
- netbeans - 为 Ubuntu 下载 Apache Netbeans
- jekyll - Zeit Now CLI 没有显示这样的文件或目录
- mysql - 从一个表中获取所有 ID 并根据它在另一个表中插入值
- python - 如何从 obj 文件在 pyOpenGL 中导入 3d 纹理
- swift - 简而言之,使用 SwiftyJSON 将对象映射到数组中
- oracle - 从 hash_value 中提取 sql_id
- loops - 如果然后循环在 AutoHotkey 之间切换桌面