我知道这个问题似乎被问了很多,但他们中的大多数最终没有得到一个积极的答案。
我有登录,注册,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,我花了几个小时试图降级一切回到工作秩序,搞砸了我的整个项目,哈哈。
2条答案
按热度按时间rsl1atfo1#
请删除这两行
编辑
使用高度为的容器 Package 单个子滚动视图:(上下文)的媒体。高度和宽度:媒体查询.of(上下文).宽度
t1rydlwq2#
因此,经过3个月不能让我的登录和注册屏幕滚动从后面的键盘,我终于想通了。
嗯......我看到了另一个解决方案的注解。无论如何,在我使用MaterialApp或GetMaterialApp的主.dart文件中,有一个属性叫做useInheritedMediaQuery。2我把它设置为真。3如果你想做任何类型的屏幕滚动,不要使用这个属性。当我注解掉那一行并重新启动我的应用程序时,我为文本字段设置的每个屏幕现在都在按照它们应该的方式滚动。