首页 > 解决方案 > 更改焦点时 TextFormField 失去价值

问题描述

我正在尝试转移到其他内容TextFormField,但是每当我从第一个TextFormField文本变为空时失去焦点时,我就会搜索此问题,但直到现在我还没有找到任何解决方案。

  var _formKey = GlobalKey<FormState>();
  Note note;

  TextEditingController titleController=TextEditingController();
  TextEditingController descriptionController=TextEditingController();

  @override
  Widget build(BuildContext context) {
    TextStyle textStyle=Theme.of(context).textTheme.title;

    titleController.text=note.title;
    descriptionController.text=note.description;

    // TODO: implement build
    return WillPopScope(    
      onWillPop: (){    
        moveToLastScreen();
      },
        child:Scaffold(
      appBar: AppBar(
        title: Text("appBarTitle"),
        leading: IconButton(icon:Icon(Icons.arrow_back),onPressed: (){   
          moveToLastScreen();
        },),
      ),
      body: Form(
          key: _formKey,
          child: Padding(
          padding: EdgeInsets.only(top: 15.0,left: 15.0,right: 10.0),
          child: ListView(
            children: <Widget>[
              //1st element
              Padding(
                padding: EdgeInsets.only(top: 15.0,bottom: 15.0,),
                child: TextFormField(
                  validator: (String value){ 
                    if(value.isEmpty)
                    {
                      return "Please enter Title";
                    }
                  },
                  controller: titleController,
                  style: textStyle,
                  onSaved: (value){
                    debugPrint("Something changed in title Text field");
                    updateTitle();
                  },
                  /*onChanged: (value){
                    debugPrint("Something changed in title Text field");
                    updateTitle();
                  },*/
                  decoration: InputDecoration(
                    labelText: "Title",
                    labelStyle: textStyle,
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5.0)
                    )
                  ),
                ),

              ),

              //2nd element
              Padding(
                padding: EdgeInsets.only(top: 15.0,bottom: 15.0,),
                child: TextFormField(
                  validator: (String value){  //2nd step for form with validation
                    if(value.isEmpty)
                    {
                      return "Please enter principle amount";
                    }
                  },
                  onSaved: (value){
                    debugPrint("Something changed in Description Text field");
                    updateDescription();
                  },
                  controller: descriptionController,
                  style: textStyle,
                  /*onChanged: (value){
                    debugPrint("Something changed in Description Text field");
                    updateDescription();
                  },*/
                  decoration: InputDecoration(
                      labelText: "Description",
                      labelStyle: textStyle,
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(5.0)
                      )
                  ),
                ),

              ),

              //3th element
              Padding(
                padding: EdgeInsets.only(top: 15.0,bottom: 15.0),
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: RaisedButton(
                        color: Theme.of(context).primaryColorDark,
                          textColor: Theme.of(context).primaryColorLight,
                          child: Text("Save",textScaleFactor: 1.5,),
                          onPressed: (){
                          setState(() {
                            if(_formKey.currentState.validate()) {
                              debugPrint("Save Pressed");
                              _save();
                            }
                          });
                          }
                      ),
                    ),

                    Container(width: 5.0,),

                    Expanded(
                      child: RaisedButton(
                          color: Theme.of(context).primaryColorDark,
                          textColor: Theme.of(context).primaryColorLight,
                          child: Text("Delete",textScaleFactor: 1.5,),
                          onPressed: (){
                            setState(() {
                              debugPrint("Delete Pressed");
                              _delete();
                            });
                          }
                      ),
                    ),
                  ],
                ),
              ),

            ],
          ),
      )),

    ));
  }

请建议我我是新来的。

标签: fluttertextbox

解决方案


从您的构建方法中删除titleController.text=note.title; descriptionController.text=note.description;并将其放入initState方法中。

您将丢失 textField 中的值,因为这些行会在任何时候执行重建,从而替换从 textFields 获得的值并将其替换为note.titleand note.description,此时它们是空的。

换句话说,删除这些行并将其添加到您的代码中。

@override
  void initState() {
    super.initState();
    titleController.text=note.title; 
    descriptionController.text=note.description;
  }

推荐阅读