Firebase 为什么初始值不更新和显示?

Firebase 为什么初始值不更新和显示?,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: '

我已经从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())
    );
  },
),

如果我正确理解了您的问题,那么您希望在从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
仅在树上的每个小部件插入时调用一次。