flutter - 更改焦点时 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();
});
}
),
),
],
),
),
],
),
)),
));
}
请建议我我是新来的。
解决方案
从您的构建方法中删除titleController.text=note.title; descriptionController.text=note.description;
并将其放入initState
方法中。
您将丢失 textField 中的值,因为这些行会在任何时候执行重建,从而替换从 textFields 获得的值并将其替换为note.title
and note.description
,此时它们是空的。
换句话说,删除这些行并将其添加到您的代码中。
@override
void initState() {
super.initState();
titleController.text=note.title;
descriptionController.text=note.description;
}
推荐阅读
- python - TypeError:fit_generator() 得到了一个意外的关键字参数“nb_val_samples”
- mysql - 如何在 MYSQL 中跟踪更改(更新/删除)以供以后查询(NOT FOR LOG)
- python - 在熊猫中使用时间分辨率查找列的平均值
- ssh - 无法连接亚马逊文档数据库中的集群
- php - 替换 PHP 中的 xdebug_get_headers() 函数
- jmeter - 如何在 Jmeter 的 os 进程采样器中运行此命令
- python - 列间计算
- c++ - 在 C++ 中创建类 const 与 const 引用的成员函数有什么区别?
- assembly - MIPS数转换
- python - 无法使用 tkinter 将我的数据添加到 mysql