微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

颤抖,隐藏虚拟键盘时文本字段值变空

如何解决颤抖,隐藏虚拟键盘时文本字段值变空

我正在尝试为我的应用创建登录注册页面,我在两个屏幕上都使用statefull小部件。 填写注册登录表单并隐藏键盘以按下注册登录按钮后,即时通讯会收到“字符串为空”的结果,同样在按下时,我尝试在控制台中打印我的电子邮件和密码,但即时通讯处却显示为空。但是,如果我在虚拟设备中仍打开虚拟键盘的情况下尝试这样做,就无法打印出字符串,据我了解,仅当隐藏键盘时才会发生错误。 这是我的输入字段类


    class RoundedInputField extends StatefulWidget {
  final String hintText;
  final ValueChanged<String> onChanged;
  final Color color;
  final bool boolean;

  RoundedInputField({
    Key key,this.hintText,this.onChanged,this.color,this.boolean = false,}) : super(key: key);

  @override
  _RoundedInputFieldState createState() => _RoundedInputFieldState();
}

class _RoundedInputFieldState extends State<RoundedInputField> {
  @override
  Widget build(BuildContext context) {
    return TextFieldContainer(
      child: TextFormField(
        onChanged: widget.onChanged,obscureText: widget.boolean,decoration: Inputdecoration(
          hintText: widget.hintText,border: InputBorder.none,),);
  }
}

class TextFieldContainer extends StatefulWidget {
  final Widget child;
  final Color color;

  const TextFieldContainer({
    Key key,this.child,this.color: Colors.white,}) : super(key: key);

  @override
  _TextFieldContainerState createState() => _TextFieldContainerState();
}

class _TextFieldContainerState extends State<TextFieldContainer> {
  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return Container(
      margin: EdgeInsets.symmetric(vertical: 10),padding: EdgeInsets.symmetric(horizontal: 20,vertical: 5),width: size.width * 0.8,decoration: Boxdecoration(
        color: widget.color,borderRadius: BorderRadius.circular(29),child: widget.child,);
  }
}




然后我叫RoundedInputField

 RoundedInputField(
              hintText: "Email",onChanged: (val) {
                email = val;
              },

这是我的注册按钮,目前仅显示


Container(
              margin: EdgeInsets.symmetric(vertical: 10),child: ClipRRect(
                borderRadius: BorderRadius.circular(29),child: FlatButton(
                  padding: EdgeInsets.symmetric(vertical: 20,horizontal: 40),color: Colors.white,onpressed: () async {
                    
                    print(email);
                    print(password);
                   
                    
                  },child: Text(
                    'login',style: GoogleFonts.montserrat(
                        color: HexColor(studentPrimaryColour),fontSize: 20),

这是我的登录屏幕


class StudentLoginScreen extends StatefulWidget {
  StudentLoginScreen();

  @override
  _StudentLoginScreenState createState() => _StudentLoginScreenState();
}

class _StudentLoginScreenState extends State<StudentLoginScreen> {
  @override
  Widget build(BuildContext context) {
    final AuthService _authService = AuthService();
    Size size = MediaQuery.of(context).size;
    String email = '';
    String password = '';
    return Scaffold(
      backgroundColor: HexColor(studentPrimaryColour),body: SafeArea(
        child: ListView(
          children: <Widget>[
            SizedBox(
              height: 25.0,headingText(
              text: 'Login',size: 60.0,SizedBox(
              height: 25.0,RoundedInputField(
              hintText: "Email",SizedBox(
              height: 5.0,RoundedInputField(
              hintText: "Password",boolean: true,onChanged: (val) {
                password = val;
              },SizedBox(
              height: 15.0,Container(
              margin: EdgeInsets.symmetric(vertical: 10),onpressed: () async {
                    
                    print(email);
                    print(password);
                   

                   
                  },InkWell(
              onTap: () {
                Navigator.pushNamed(context,'/studentRegisterScreen');
              },child: headingText(
                text: 'register?',size: 10,],);
  }
}



解决方法

在登录屏幕中,您声明并初始化了email方法内的属性passwordbuild。这实际上意味着,一旦重新构建登录小部件(例如,由于Flutter必须重新计算大小等原因而隐藏键盘时),这两个属性都将再次用''。

初始化。

这就是StatefulWidget的意思-将属性定义为状态的一部分,而不是构建周期的一部分。换句话说,将其更改为:

class StudentLoginScreen extends StatefulWidget {
  StudentLoginScreen();

  @override
  _StudentLoginScreenState createState() => _StudentLoginScreenState();
}

class _StudentLoginScreenState extends State<StudentLoginScreen> {
  String email = '';
  String password = '';

  @override
  Widget build(BuildContext context) {
  ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?