Firebase 为什么初始值不更新和显示?
我已经从RegisteredPatient小部件返回了患者IC号,但是初始值不会更新和显示。我已尝试打印患者IC的值,但我不理解为什么初始值不更新。我甚至还尝试过setstateFirebase 为什么初始值不更新和显示?,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我已经从RegisteredPatient小部件返回了患者IC号,但是初始值不会更新和显示。我已尝试打印患者IC的值,但我不理解为什么初始值不更新。我甚至还尝试过setstate TextFormField( initialValue: ic, validator: (val) => val.isEmpty ? 'Enter patient IC' : null, decoration: textInputDecoration.copyWith( hintText: '
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())
);
},
),
如果我正确理解了您的问题,那么您希望在从RegisteredPatient路线返回时更新textfield的值。为此,您应执行以下操作: 声明
TextEditingController _textEditingController = TextEditingController();
在您的TextFormField上
onTap: () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => RegisteredPatient())
).then((newIcValue){
setState(() {
_textEditingController.text = newIcValue;
});
});
},
如果我正确理解了您的问题,那么您希望在从RegisteredPatient路线返回时更新textfield的值。为此,您应执行以下操作: 声明
TextEditingController _textEditingController = TextEditingController();
在您的TextFormField上
onTap: () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => RegisteredPatient())
).then((newIcValue){
setState(() {
_textEditingController.text = newIcValue;
});
});
},
TextFormField
的生命周期由它自己的状态(\u TextFormFieldState
)在内部管理,如果您不提供自己的,它有一个textededitingcontroller
,并且只在第一次构建并插入小部件时设置初始值(因此,为该小部件创建RenderObject
)
您可以查看\u TextFormFieldState
并查看初始值的使用位置
@override
void initState() {
super.initState();
if (widget.controller == null) {
_controller = TextEditingController(text: widget.initialValue);
} else {
widget.controller.addListener(_handleControllerChanged);
}
}
这意味着,除非您从树中完全销毁/删除该小部件(例如,通过关闭其插入的屏幕),否则它将永远不会更新该值,但您也不需要,因为创建的TextEditingController
,应该将其保留在屏幕上
这意味着,如果要更新已生成的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);
},
),
}
TextFormField
的生命周期由它自己的状态(\u TextFormFieldState
)在内部管理,如果您不提供自己的,它有一个textededitingcontroller
,并且只在第一次构建并插入小部件时设置初始值(因此,为该小部件创建RenderObject
)
您可以查看\u TextFormFieldState
并查看初始值的使用位置
@override
void initState() {
super.initState();
if (widget.controller == null) {
_controller = TextEditingController(text: widget.initialValue);
} else {
widget.controller.addListener(_handleControllerChanged);
}
}
这意味着,除非您从树中完全销毁/删除该小部件(例如,通过关闭其插入的屏幕),否则它将永远不会更新该值,但您也不需要,因为创建的TextEditingController
,应该将其保留在屏幕上
这意味着,如果要更新已生成的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);
},
),
}
您的意思是当您键入一些ic值未更新且屏幕上没有任何更改时?ic值实际上有一个从RegisteredPatient小部件返回的值。但初始值不会更新以显示。您能否共享RegisteredPatient
小部件的代码以及显示TextFormField的小部件?这里有您的问题中缺少信息。为什么要更改initialValue属性。它的唯一目的是在初始位置,而不是在之后更改。您的意思是,当您键入某些内容时,ic值没有更新,屏幕上没有任何更改?ic值实际上有一个从RegisteredPatient小部件返回的值。但是initialValuee不更新以显示。您是否可以共享RegisteredPatient
小部件的代码以及显示TextFormField的小部件?您的问题中缺少信息。为什么要更改initialValue属性。它的唯一目的是最初存在,而不是后来更改。为了进一步澄清,init状态仅运行一次,对吗?因此,一旦设置状态运行,唯一改变的是控制器本身?当您调用setState
时,它将为调用它的状态调用build
方法,并为子级(如果有)调用diupdatewidget
initState
只会被调用一次,在树上每个小部件插入一次。为了进一步澄清,initState只会运行一次,对吗?所以一旦setState运行,唯一改变的就是控制器本身?当您调用setState
时,它会调用build
方法来表示c调用它,并为该小部件的子部件(如果有)调用didUpdateWidget
。initState
仅在树上的每个小部件插入时调用一次。