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

时间:2020-01-27 10:31:34

标签: 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: 'Patient IC e.g. 960XXXXXXXXX'
  ),
  onChanged: (val) {
    setState(() => ic = val);
  },
  onTap: () async {
    ic = await Navigator.push(
      context, 
      MaterialPageRoute(builder: (context) => RegisteredPatient())
    );
  },
),

2 个答案:

答案 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