Flutter键盘覆盖文本字段

wz8daaqr  于 2023-03-04  发布在  Flutter
关注(0)|答案(2)|浏览(160)

我知道这个问题似乎被问了很多,但他们中的大多数最终没有得到一个积极的答案。
我有登录,注册,showmodalbottomsheet,和其他一些当leyboard打开时它们都不会向上移动的地方,我开始认为这是flutter中的一个bug。
到目前为止我所尝试的
-SingleScrollView Package 了容器和列以及其他一些变体,无论我在哪里尝试使用,SingleScrollView都不起作用。我还读到不要在任何地方扩展小部件,而尝试这个,所以我拖了一两个屏幕,以消除使用它们没有结果-删除android构建清单中的全屏:真选项,这没有产生任何影响。-尝试容器和列中的列表视图,尝试页面上其他小部件的内部和外部-在所有其他测试中,脚手架resizebottominset属性无数次,看看是否也有任何影响

  • 沿着部件树在一堆地方填充.mediaquery.of(context).viewInsets.bottom,没有任何变化

这是我的注册屏幕,没有什么花哨或不寻常的

Widget build(BuildContext context) {
    _deviceHeight = MediaQuery.of(context).size.height;
    _deviceWidth = MediaQuery.of(context).size.width;
    return SafeArea(
      child: Scaffold(
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.symmetric(
              horizontal: _deviceWidth * 0.03,
              vertical: _deviceHeight * 0.02,
            ),
            width: _deviceWidth * 0.97,
            height: _deviceHeight * 0.98,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                LoginTitle(
                  title: 'Sign Up',
                  subtitle: 'Create an account...',
                  titleFontSize: 75.sp,
                  subFontSize: 25.sp,
                ),
                SizedBox(height: 10.h),
                buildSignUpForm(),
                SizedBox(height: 20.h),
                Text(
                  'Already have an account?',
                  style: TextStyle(
                    fontSize: 20.sp,
                    color: Colors.orange,
                  ),
                ),
                TextButton(
                  onPressed: () {
                    FocusScope.of(context).unfocus();
                    Get.to(() => LoginScreen());
                  },
                  child: Text(
                    'Sign In',
                    style: TextStyle(
                      color: kSecondaryColor,
                      fontSize: 20.sp,
                    ),
                  ),
                  style: ButtonStyle(
                    overlayColor: MaterialStateColor.resolveWith((states) => Colors.transparent),
                  ),
                ),
                // Padding(
                //   padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
                // ),
              ],
            ),
          ),
        ),
      ),
    );
  }

这是嵌套在页面上的buildSignUpForm

// Sign-up form Section
  SizedBox buildSignUpForm() {
    return SizedBox(
      height: _deviceHeight * 0.6,
      child: Form(
        key: _signUpFormKey,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            RoundedTextFormField(
              autoFocus: true,
              focusNode: _nameFocus,
              onFieldSubmitted: _fieldFocusChange(context, _nameFocus, _emailFocus),
              keyboardType: TextInputType.name,
              keyboardAction: TextInputAction.next,
              controller: _nameController,
              hintText: 'Name',
              validator: (value) {
                if (value.toString().length <= 2 || value!.isEmpty) {
                  return 'Enter a valid Name';
                }
                return null;
              },
            ),
            SizedBox(height: _deviceHeight * 0.03),
            RoundedTextFormField(
              focusNode: _emailFocus,
              onFieldSubmitted: _fieldFocusChange(context, _emailFocus, _passwordFocus),
              keyboardType: TextInputType.emailAddress,
              keyboardAction: TextInputAction.next,
              controller: _emailController,
              hintText: 'Email',
              validator: (email) => email != null && !EmailValidator.validate(email) ? 'Enter a valid email' : null,
            ),
            SizedBox(height: _deviceHeight * 0.03),
            RoundedTextFormField(
              focusNode: _passwordFocus,
              onFieldSubmitted: _fieldFocusChange(context, _passwordFocus, _passwordConfirmFocus),
              keyboardType: TextInputType.visiblePassword,
              keyboardAction: TextInputAction.next,
              obsecureText: true,
              controller: _passwordController,
              hintText: 'Password',
              validator: (value) {
                if (value.toString().length < 6 || value!.isEmpty) {
                  return 'Password should be longer or equal to 6 characters.';
                }
                return null;
              },
            ),
            SizedBox(height: _deviceHeight * 0.03),
            RoundedTextFormField(
              focusNode: _passwordConfirmFocus,
              keyboardAction: TextInputAction.send,
              onFieldSubmitted: (_) {
                Utilities.logInfo('Signup Submit button Pressed');
                if (_signUpFormKey.currentState!.validate()) {
                  _signUpFormKey.currentState!.save();
                  setState(() {
                    _isLoading = true;
                  });
                  FocusScope.of(context).unfocus();
                  String name = _nameController.text.trim();
                  String email = _emailController.text.trim();
                  String password = _passwordController.text.trim();

                  Utilities.logInfo('Attempting Signup with Firebase');
                  _authController.signUpWithEmail(name, email, password);
                  setState(() {
                    _isLoading = false;
                  });
                }
              },
              keyboardType: TextInputType.visiblePassword,
              obsecureText: true,
              hintText: 'Confirm Password',
              validator: (value) {
                if (value!.trim() != _passwordController.text.trim() || value.isEmpty) {
                  return 'Passwords do not match!';
                }
                return null;
              },
            ),
            SizedBox(height: _deviceHeight * 0.03),
            _isLoading
                ? const CircularProgressIndicator() // TODO custom progress indicator
                : VextElevatedButton(
                    buttonText: 'Sign Up',
                    onPressed: () {
                      debugPrint('Signup Submit button Pressed');
                      if (_signUpFormKey.currentState!.validate()) {
                        _signUpFormKey.currentState!.save();
                        setState(() {
                          _isLoading = true;
                        });
                        FocusScope.of(context).unfocus();
                        String name = _nameController.text.trim();
                        String email = _emailController.text.trim();
                        String password = _passwordController.text.trim();

                        debugPrint('Attempting Signup with Firebase');
                        _authController.signUpWithEmail(name, email, password);
                        setState(() {
                          _isLoading = false;
                        });
                      }
                    },
                  ),
            SizedBox(height: _deviceHeight * 0.03),
          ],
        ),
      ),
    );
  }
}

我没有主意了,现在开始阅读同样的论坛结果,从网络搜索,都说尝试同样的事情一遍又一遍。我错过了什么吗?任何帮助或选项以外,我看到张贴在网上将不胜感激。
哦,我用 dart 2.16.2(稳定)和Flutter2.10.5请不要问我升级,我做了一次从2.2到2.5,花了几天时间试图让它再次工作。然后试图3.0,我花了几个小时试图降级一切回到工作秩序,搞砸了我的整个项目,哈哈。

rsl1atfo

rsl1atfo1#

请删除这两行

width: _deviceWidth * 0.97,
            height: _deviceHeight * 0.98,

编辑
使用高度为的容器 Package 单个子滚动视图:(上下文)的媒体。高度和宽度:媒体查询.of(上下文).宽度

t1rydlwq

t1rydlwq2#

因此,经过3个月不能让我的登录和注册屏幕滚动从后面的键盘,我终于想通了。
嗯......我看到了另一个解决方案的注解。无论如何,在我使用MaterialApp或GetMaterialApp的主.dart文件中,有一个属性叫做useInheritedMediaQuery。2我把它设置为真。3如果你想做任何类型的屏幕滚动,不要使用这个属性。当我注解掉那一行并重新启动我的应用程序时,我为文本字段设置的每个屏幕现在都在按照它们应该的方式滚动。

相关问题