Flutter 单击其中一个TextField时,TextField文本被清除

Flutter 单击其中一个TextField时,TextField文本被清除,flutter,flutter-layout,Flutter,Flutter Layout,我遇到了一个奇怪的问题,如果你点击其中一个文本字段,它总是会被清除 class MyEditText extends StatefulWidget { static String tag = "MyEditText"; @override MyEditTextState createState() => MyEditTextState(); } class MyEditTextState extends State<MyEditText> { String r

我遇到了一个奇怪的问题,如果你点击其中一个文本字段,它总是会被清除

class MyEditText extends StatefulWidget {
  static String tag = "MyEditText";
  @override
  MyEditTextState createState() => MyEditTextState();
}

class MyEditTextState extends State<MyEditText> {
  String results = "";
  final TextEditingController controller = new TextEditingController();
  final TextEditingController controller1 = new TextEditingController();

  @override
  Widget build(BuildContext context) {
    final email = TextField(
      decoration: InputDecoration(
          hintText: 'Enter Email',
          contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0)),
    );

    final password = TextField(
      obscureText: true,
      decoration: InputDecoration(
        hintText: 'Enter Password',
        contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
      ),
    );

    return new Scaffold(
      appBar: new AppBar(
        automaticallyImplyLeading: false,
        title: new Text("EditText Sample"),
        backgroundColor: Colors.yellow,
      ),
      body: new Container(
        child: new Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[email, password],
        ),
      ),
    );
  }
}
类MyEditText扩展StatefulWidget{
静态字符串tag=“MyEditText”;
@凌驾
MyEditTextState createState()=>MyEditTextState();
}
类MyEditTextState扩展了状态{
字符串结果=”;
最终文本编辑控制器控制器=新文本编辑控制器();
最终文本编辑控制器控制器1=新文本编辑控制器();
@凌驾
小部件构建(构建上下文){
最终电子邮件=文本字段(
装饰:输入装饰(
hintText:“输入电子邮件”,
contentPadding:EdgeInsets.fromLTRB(20.0,10.0,20.0,10.0)),
);
最终密码=文本字段(
蒙昧文字:对,
装饰:输入装饰(
hintText:“输入密码”,
内容填充:来自LTRB(20.0,10.0,20.0,10.0)的EdgeInsets,
),
);
归还新脚手架(
appBar:新的appBar(
自动嵌入:false,
标题:新文本(“编辑文本样本”),
背景颜色:Colors.yellow,
),
主体:新容器(
子:新列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[电子邮件,密码],
),
),
);
}
}
我正在为它使用stavity小部件,并且这个屏幕启动的所有类也都是stavity

注意:如果我注释掉所有TextEditingController及其用法,一切正常,因此我不知道TextEditingController有什么问题

TextEditingController=TextEditingController();
TextEditingController控制器1=TextEditingController();
最终电子邮件=文本字段(
控制器:emailController,
键盘类型:TextInputType.emailAddress,
装饰:输入装饰(
前缀:图标(Icons.person\u轮廓,颜色:Colors.grey),
hintText:“输入电子邮件”,
contentPadding:EdgeInsets.fromLTRB(20.0,10.0,20.0,10.0)),
);
最终密码=文本字段(
控制器1:passwordController,
蒙昧文字:对,
装饰:输入装饰(
前缀:图标(Icons.lock\u open,颜色:Colors.grey),
hintText:“输入密码”,
内容填充:来自LTRB(20.0,10.0,20.0,10.0)的EdgeInsets,
),
);
clearName(){
controller.text='';
controller1.text='';
}
//在需要时调用clearName函数

TextEditingController=TextEditingController();
TextEditingController控制器1=TextEditingController();
最终电子邮件=文本字段(
控制器:emailController,
键盘类型:TextInputType.emailAddress,
装饰:输入装饰(
前缀:图标(Icons.person\u轮廓,颜色:Colors.grey),
hintText:“输入电子邮件”,
contentPadding:EdgeInsets.fromLTRB(20.0,10.0,20.0,10.0)),
);
最终密码=文本字段(
控制器1:passwordController,
蒙昧文字:对,
装饰:输入装饰(
前缀:图标(Icons.lock\u open,颜色:Colors.grey),
hintText:“输入密码”,
内容填充:来自LTRB(20.0,10.0,20.0,10.0)的EdgeInsets,
),
);
clearName(){
controller.text='';
controller1.text='';
}
//在任何需要的地方调用clearName函数
您可以这样尝试吗

TextFormField(
                cursorColor: Colors.white,
                autofocus: false,
                keyboardType:
                TextInputType.emailAddress,
                controller: _textEditingControllerEmail,
                ),

 TextFormField(
               autofocus: false,
               controller:_textEditingControllerPassword,
               cursorColor: Colors.white,
               obscureText: true,
               ),
你能这样试试吗

TextFormField(
                cursorColor: Colors.white,
                autofocus: false,
                keyboardType:
                TextInputType.emailAddress,
                controller: _textEditingControllerEmail,
                ),

 TextFormField(
               autofocus: false,
               controller:_textEditingControllerPassword,
               cursorColor: Colors.white,
               obscureText: true,
               ),

谢谢你的更新代码

清除
textededitingcontroller
的原因是您在
状态中声明了变量。当状态重新初始化时,这些变量也会重新初始化

我可以找到两种解决方法:

#1-将控制器移出状态到父类,并将其作为参数传递 控制器在父类中的
MyEditText
widget外部声明和维护

类MyEditText扩展StatefulWidget{
MyEditText({Key-Key,this.emailController,this.passwordController}):超级(Key:Key);
最终文本编辑控制器emailController;
最终文本编辑控制器密码控制器;
静态字符串tag=“MyEditText”;
@凌驾
MyEditTextState createState()=>MyEditTextState();
}
类MyEditTextState扩展了状态{
字符串结果=”;
@凌驾
小部件构建(构建上下文){
// ...
文本字段(
控制器:widget.emailController,
// ...,
),
文本字段(
控制器:widget.passwordController,
// ...,
),
// ...
}
}
然后在父类中声明控制器,并将其作为参数传递给
MyEditText

final-emailController=TextEditingController();
最终密码控制器=TextEditingController();
// ...
髓鞘文本(
emailController:emailController,
passwordController:passwordController,
)

#2-在调用时从旧状态重用控制器 控制器可以在
MyEditText
类之外声明,但如果没有声明,则小部件会自行创建和维护
TextEditingController

类MyEditText扩展StatefulWidget{
MyEditText({Key-Key,this.emailController,this.passwordController}):超级(Key:Key);
最终文本编辑控制器emailController;
最终文本编辑控制器密码控制器;
静态字符串tag=“MyEditText”;
@凌驾
MyEditTextState createState()=>MyEditTextState();
}
类MyEditTextState扩展了状态{
TextEditingController\u emailController;
text编辑控制器\u密码控制器;
@凌驾
void initState(){
super.initState();
if(widget.emailController==null)
_emailController=TextEditingController();
if(widget.passwordController==null)
_passwordController=TextEditingController();
}
@凌驾
void didUpdateWidget(MyEditText-oldWidget){