Поле текстовой формы теряет значение при смене фокуса

#flutter #textbox

#flutter #текстовое поле

Вопрос:

Я пытаюсь перейти к другому, 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();
                            });
                          }
                      ),
                    ),
                  ],
                ),
              ),

            ],
          ),
      )),

    ));
  }
  

Пожалуйста, предложите мне, я новичок во flutter.

Ответ №1:

Удалите titleController.text=note.title; descriptionController.text=note.description; из вашего метода сборки и поместите его в initState метод.

Вы потеряете значение в текстовом поле, потому что эти строки выполняются всякий раз, когда происходит перестройка, тем самым заменяя значения, полученные из текстовых полей, и заменяя их на note.title и note.description , которые в этот момент пусты.

Другими словами, удалите эти строки и добавьте это в свой код.

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

Комментарии:

1. Я не могу вспомнить ни одного ресурса. Официальный учебник — good flutter.dev/docs /reference /tutorials , скучное шоу — youtube.com /… и MTechViral — youtube.com/… (Вы можете пропустить некоторые из ранних версий на хинди)

2. используйте flutter_hooks!