Flutter 在onPressed中添加设置状态正在清除我的文本字段(颤振)

Flutter 在onPressed中添加设置状态正在清除我的文本字段(颤振),flutter,Flutter,我在使用iconbutton显示和隐藏密码时遇到问题。起初我没有在Textfield中添加控制器,它运行良好,但在我为Textfield添加控制器之后,当我按下图标按钮时,Textfield被清除。我试着删除onpressed上的setState,它什么也不做,也不清除文本字段强文本 这是我的密码 class LoginState extends State<Login>{ Icon visibilityIcon = Icon(Icons.visibility); bool

我在使用iconbutton显示和隐藏密码时遇到问题。起初我没有在Textfield中添加控制器,它运行良好,但在我为Textfield添加控制器之后,当我按下图标按钮时,Textfield被清除。我试着删除onpressed上的setState,它什么也不做,也不清除文本字段强文本

这是我的密码

class LoginState extends State<Login>{
  Icon visibilityIcon = Icon(Icons.visibility);
  bool isVisible = false;

  @override
  Widget build(BuildContext context) {
    final fieldWidth = 350.0;
    final TextEditingController password = new TextEditingController();
    final TextEditingController userName = new TextEditingController();

    return Scaffold(
        body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [
          Center(
            child: Container(
                height: 50.0,
                width: fieldWidth,
                child: Align(
                  alignment: FractionalOffset(0.2, 0.6),
                  child:TextField(controller:userName,decoration: const InputDecoration(hintText: "Username",),style: TextStyle(fontSize: 16,color: Colors.grey[850]),),
                )
            ),
          ),
          Center(
            child: Container(
              height: 80,
              width: fieldWidth,
              child: Align(
                  alignment: FractionalOffset(0.2, 0.6),
                  child: Stack(alignment: Alignment.centerRight,children: [TextField(controller: password,decoration: const InputDecoration(hintText: "Password"),obscureText: !isVisible,style: TextStyle(fontSize: 16,color: Colors.grey[850]),),
                    IconButton(icon: visibilityIcon,onPressed: (){
                      setState(() {
                        if(!isVisible)
                        {
                          // print(password.text);
                          // visibilityIcon = Icon(Icons.visibility);
                          // isVisible = true;
                        }
                        else
                        {
                          // visibilityIcon = Icon(Icons.visibility_off);
                          // isVisible = false;
                        }
                      });
                    }
                      ,)],)
              ),
            ),
          ),
          Center(child: RaisedButton(
            onPressed: () => onPressedLogin(password.text,userName.text),
            color: Colors.grey[900],
            focusColor: Colors.grey[400],
            child: Container(
              width: fieldWidth-30,
              child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text("Login",style: TextStyle(color: Colors.white60),),
                    Icon(Icons.login_outlined,color:Colors.white60 ,)
                  ]),),),)
        ],),)
    );

  }

  void onPressedLogin(String userName,String password){
    print(userName+" "+password);
  }
}
类LoginState扩展状态{
图标可见性图标=图标(Icons.visibility);
bool isVisible=false;
@凌驾
小部件构建(构建上下文){
最终场宽=350.0;
最终文本编辑控制器密码=新文本编辑控制器();
最终TextEditingController用户名=新的TextEditingController();
返回脚手架(
主体:中心(子项:列)(mainAxisAlignment:mainAxisAlignment.Center,子项:[
居中(
子:容器(
身高:50.0,
宽度:字段宽度,
子对象:对齐(
校准:分数偏移(0.2,0.6),
子项:TextField(控制器:用户名,装饰:常量输入装饰(hintText:“用户名”,),样式:TextStyle(fontSize:16,颜色:Colors.grey[850]),
)
),
),
居中(
子:容器(
身高:80,
宽度:字段宽度,
子对象:对齐(
校准:分数偏移(0.2,0.6),
child:Stack(对齐方式:alignment.centerRight,children:[TextField(控制器:密码,装饰:const-input装饰(hintText:password)),蒙蔽文本:!isVisible,样式:TextStyle(fontSize:16,颜色:Colors.grey[850]),
图标按钮(图标:可见性图标,按下时:(){
设置状态(){
如果(!isVisible)
{
//打印(密码.文本);
//visibilityIcon=图标(Icons.visibility);
//isVisible=true;
}
其他的
{
//visibilityIcon=图标(Icons.visibility\u off);
//isVisible=false;
}
});
}
,)],)
),
),
),
居中(子项:升起按钮(
onPressed:()=>onPressedLogin(密码.文本,用户名.文本),
颜色:颜色。灰色[900],
聚焦颜色:颜色。灰色[400],
子:容器(
宽度:fieldWidth-30,
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“登录”,样式:TextStyle(颜色:Colors.white60),),
图标(Icons.login\u概述,颜色:Colors.white60,)
]),),),)
],),)
);
}
void onPressedLogin(字符串用户名、字符串密码){
打印(用户名+“”+密码);
}
}

问题在于每次重建构建方法时,您都会在构建方法中创建新的TextEditingController()。要修复此问题,只需将控制器移到构建方法之外,如下所示:

class _LoginState extends State<Login>{
  Icon visibilityIcon = Icon(Icons.visibility);
  bool isVisible = false;

  final TextEditingController password = new TextEditingController();
  final TextEditingController userName = new TextEditingController();
class\u LoginState扩展状态{
图标可见性图标=图标(Icons.visibility);
bool isVisible=false;
最终文本编辑控制器密码=新文本编辑控制器();
最终TextEditingController用户名=新的TextEditingController();

请让我知道这对你有帮助。干杯

我是新来的。哇,你刚刚救了我:D,顺便问一下,我该如何设置这个为“回答”呢?我是新来的StackOverflow不能给你投票:(我的声誉太低了,但是的,谢谢:Dglad帮助了:)你应该可以用“检查图标”来接受答案uder向上投票/向下投票图标位于左侧。我将不胜感激。谢谢