Flutter 关闭键盘时清除颤振文本表单字段

Flutter 关闭键盘时清除颤振文本表单字段,flutter,android-softkeyboard,form-fields,Flutter,Android Softkeyboard,Form Fields,和我在标题中描述的差不多。当应用程序启动时,我从Firebase中填充了一堆TextFormFields 用户应该能够更新这些内容,完成后,单击submit按钮更新数据库。数据库代码都可以正常工作,但是存在一些bug,如下所示: TextFormField1: "New Text Entered" TextFormField2: "Some more text" TextFormField3: "Another update here" 现在,我们需要关闭键盘,以便可以看到下面的s

和我在标题中描述的差不多。当应用程序启动时,我从Firebase中填充了一堆TextFormFields

用户应该能够更新这些内容,完成后,单击submit按钮更新数据库。数据库代码都可以正常工作,但是存在一些bug,如下所示:

TextFormField1:   "New Text Entered"
TextFormField2:   "Some more text"
TextFormField3:   "Another update here"
现在,我们需要关闭键盘,以便可以看到下面的submit按钮。只要单击小向下箭头关闭键盘,以上所有更改都会恢复到原始状态

有人看到这个吗

我在运行时预填充这些字段中的数据,您可以编辑和更新文本,一切正常。。。除非你最小化键盘


请告诉我,Flitter并不是在做一些根本愚蠢的事情,比如每次你要求键盘离开时,从头开始重新加载下面的小部件。。。。。。有点像是这样。

是的。这件事一直发生在我身上。这是因为当底部插入(由于键盘)改变时,屏幕会重建

  • TextFormField
    括在
    表单中,并给它一个全局键
  • 使用局部变量存储TextFormField的值。在onChanged方法中更新它。 全部完成 为了方便起见,我将附上一个代码

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: LoginScreen(),
        );
      }
    }
    
    // Login Screen
    class LoginScreen extends StatefulWidget {
      @override
      _LoginScreenState createState() => _LoginScreenState();
      static GlobalKey<FormState> _loginScreenFormKey = GlobalKey<FormState>();
    }
    
    class _LoginScreenState extends State<LoginScreen> {
      String username;
      String password;
    
      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: Scaffold(
            body: Form(
              key: LoginScreen._loginScreenFormKey,
              child: Column(
                children: [
                  TextFormField(
                    decoration: InputDecoration(
                      hintText: 'Enter username',
                    ),
                    onChanged: (value) {
                      setState(() {
                        username = value;
                      });
                    },
                  ),
                  TextFormField(
                    decoration: InputDecoration(
                      hintText: 'Enter username',
                    ),
                    onChanged: (value) {
                      setState(() {
                        password = value;
                      });
                    },
                    obscureText: true,
                  ),
                  RaisedButton(
                    onPressed: () {
                      LoginScreen._loginScreenFormKey.currentState.save();
                    },
                    child: Text('submit'),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    
    
    导入“包装:颤振/材料.省道”;
    void main(){
    runApp(MyApp());
    }
    类MyApp扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    返回材料PP(
    debugShowCheckedModeBanner:false,
    主页:LoginScreen(),
    );
    }
    }
    //登录屏幕
    类LoginScreen扩展StatefulWidget{
    @凌驾
    _LoginsScreenState createState()=>\u LoginsScreenState();
    静态GlobalKey _loginScreenFormKey=GlobalKey();
    }
    类_LoginScreenState扩展状态{
    字符串用户名;
    字符串密码;
    @凌驾
    小部件构建(构建上下文){
    返回安全区(
    孩子:脚手架(
    正文:表格(
    键:LoginScreen.\u loginscreeformkey,
    子:列(
    儿童:[
    TextFormField(
    装饰:输入装饰(
    hintText:'输入用户名',
    ),
    一旦更改:(值){
    设置状态(){
    用户名=值;
    });
    },
    ),
    TextFormField(
    装饰:输入装饰(
    hintText:'输入用户名',
    ),
    一旦更改:(值){
    设置状态(){
    密码=值;
    });
    },
    蒙昧文字:对,
    ),
    升起的按钮(
    已按下:(){
    LoginScreen.\u loginscreeformkey.currentState.save();
    },
    子项:文本('submit'),
    ),
    ],
    ),
    ),
    ),
    );
    }
    }
    
    是。这件事一直发生在我身上。这是因为当底部插入(由于键盘)改变时,屏幕会重建

  • TextFormField
    括在
    表单中,并给它一个全局键
  • 使用局部变量存储TextFormField的值。在onChanged方法中更新它。 全部完成 为了方便起见,我将附上一个代码

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: LoginScreen(),
        );
      }
    }
    
    // Login Screen
    class LoginScreen extends StatefulWidget {
      @override
      _LoginScreenState createState() => _LoginScreenState();
      static GlobalKey<FormState> _loginScreenFormKey = GlobalKey<FormState>();
    }
    
    class _LoginScreenState extends State<LoginScreen> {
      String username;
      String password;
    
      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: Scaffold(
            body: Form(
              key: LoginScreen._loginScreenFormKey,
              child: Column(
                children: [
                  TextFormField(
                    decoration: InputDecoration(
                      hintText: 'Enter username',
                    ),
                    onChanged: (value) {
                      setState(() {
                        username = value;
                      });
                    },
                  ),
                  TextFormField(
                    decoration: InputDecoration(
                      hintText: 'Enter username',
                    ),
                    onChanged: (value) {
                      setState(() {
                        password = value;
                      });
                    },
                    obscureText: true,
                  ),
                  RaisedButton(
                    onPressed: () {
                      LoginScreen._loginScreenFormKey.currentState.save();
                    },
                    child: Text('submit'),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    
    
    导入“包装:颤振/材料.省道”;
    void main(){
    runApp(MyApp());
    }
    类MyApp扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    返回材料PP(
    debugShowCheckedModeBanner:false,
    主页:LoginScreen(),
    );
    }
    }
    //登录屏幕
    类LoginScreen扩展StatefulWidget{
    @凌驾
    _LoginsScreenState createState()=>\u LoginsScreenState();
    静态GlobalKey _loginScreenFormKey=GlobalKey();
    }
    类_LoginScreenState扩展状态{
    字符串用户名;
    字符串密码;
    @凌驾
    小部件构建(构建上下文){
    返回安全区(
    孩子:脚手架(
    正文:表格(
    键:LoginScreen.\u loginscreeformkey,
    子:列(
    儿童:[
    TextFormField(
    装饰:输入装饰(
    hintText:'输入用户名',
    ),
    一旦更改:(值){
    设置状态(){
    用户名=值;
    });
    },
    ),
    TextFormField(
    装饰:输入装饰(
    hintText:'输入用户名',
    ),
    一旦更改:(值){
    设置状态(){
    密码=值;
    });
    },
    蒙昧文字:对,
    ),
    升起的按钮(
    已按下:(){
    LoginScreen.\u loginscreeformkey.currentState.save();
    },
    子项:文本('submit'),
    ),
    ],
    ),
    ),
    ),
    );
    }
    }
    
    Hi Abhay,我正在尝试使用您的解决方案,但失败了,它告诉我“多个小部件使用了同一个GlobalKey。”。我正在使用GlobalKey进行登录和注册。我不允许在应用程序的其他任何地方使用GlobalKey吗?这不应该发生。通常,LoginScreen.keyName和RegistrationScreen.keyName被识别为两个独立的键。也就是说,用于登录的密钥不应用于注册。必须以类似的方式在注册屏幕类中定义新密钥。如果问题仍然存在,请尝试更改两个键的名称。否则可能会出现在小部件之间重定向的问题。我可能想看更多的代码来理解这一部分