首页 > 解决方案 > 为什么初始值不更新和显示?

问题描述

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

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


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);
  },
),
}

推荐阅读