#flutter #dart #flutter-layout
#flutter #dart #flutter-макет
Вопрос:
У меня есть эта настройка формы регистрации в контейнере, я хочу, чтобы этот контейнер был прикреплен к нижней части экрана. Я попытался обернуть его с помощью виджета Positioned и установить его дно равным нулю, но это не работает.
Container(
margin: EdgeInsets.only(top: kSpacingUnit * 1.0),
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
boxShadow: kBoxShadow,
),
padding: EdgeInsets.fromLTRB(
0.1 * SizingInfo.screenWidth,
0.1 * SizingInfo.screenWidth,
0.1 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
),
child: Form(
key: _formKey,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(height: 0.1 * SizingInfo.screenWidth),
Padding(
padding: EdgeInsets.fromLTRB(
0.01 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
0.01 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
),
child: TextFormField(
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value.isEmpty) {
return 'Email Address cannot be left empty';
}
if (!value.contains('@') || !value.contains('.')) {
return 'Enter a valid Email Address';
}
return null;
},
onChanged: (value) {
setState(() => _email = value.trim());
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.mail_outline),
labelText: 'Email Address',
labelStyle: TextStyle(
fontSize: 16.0,
color: Colors.black54,
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.black54),
),
),
style: TextStyle(
fontSize: 16.0,
color: Colors.black54,
),
onTap: null,
),
),
SizedBox(height: 0.01 * SizingInfo.screenWidth),
Padding(
padding: EdgeInsets.fromLTRB(
0.01 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
0.01 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
),
child: TextFormField(
obscureText: true,
validator: (value) {
if (value.isEmpty) {
return 'Password cannot be left empty';
}
if (value.length < 6) {
return 'Password needs to be at least 6 characters long';
}
return null;
},
onChanged: (value) {
setState(() => _password = value);
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.lock_outline),
labelText: 'Password',
labelStyle: TextStyle(
fontSize: 16.0,
color: Colors.black54,
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.black54),
),
suffixIcon: Icon(
Icons.remove_red_eye,
color: Colors.grey.shade400,
),
),
style: TextStyle(
fontSize: 16.0,
color: Colors.black54,
),
),
),
SizedBox(height: 0.01 * SizingInfo.screenWidth),
Padding(
padding: EdgeInsets.fromLTRB(
0.01 * SizingInfo.screenWidth,
0.01 * SizingInfo.screenWidth,
0.01 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text(
'Forgot Password ?',
style: TextStyle(
color: Colors.black54,
fontSize: 12.0,
fontWeight: FontWeight.w400),
),
],
),
),
SizedBox(height: 0.05 * SizingInfo.screenWidth),
GestureDetector(
onTap: () {
if (_formKey.currentState.validate()) {
final _signInResponse =
_auth.signInWithEmail(this._email, this._password);
if (_signInResponse != null) {
Navigator.pushReplacementNamed(context, '/');
}
}
},
child: LoginButton(
buttonTitle: 'Sign In',
textColor: Colors.white,
iconPath: Icons.lock_outline,
iconColor: Colors.white,
),
),
SizedBox(height: 0.02 * SizingInfo.screenWidth),
Padding(
padding: EdgeInsets.fromLTRB(
0.01 * SizingInfo.screenWidth,
0.00 * SizingInfo.screenWidth,
0.01 * SizingInfo.screenWidth,
0.05 * SizingInfo.screenWidth,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text(
'Need an account?',
style: TextStyle(
color: Colors.black54,
fontSize: 14,
fontWeight: FontWeight.w400,
),
),
SizedBox(width: 0.01 * SizingInfo.screenWidth),
GestureDetector(
onTap: () => Navigator.pushReplacementNamed(
context, '/signup'),
child: Text(
'Sign Up',
style: TextStyle(
color: Color(0xFF528DF9),
fontSize: 14.0,
fontWeight: FontWeight.w500),
),
),
],
),
),
SizedBox(height: 0.05 * SizingInfo.screenWidth),
Padding(
padding: EdgeInsets.symmetric(
horizontal: 0.01 * SizingInfo.screenWidth),
child: Row(
children: <Widget>[
Expanded(
child: Container(
child: Divider(
height: 0.0,
thickness: 0.5,
color: Colors.black54,
),
),
),
Text(
' Sign In With ',
style: TextStyle(
color: Colors.black54,
fontSize: 16.0,
),
),
Expanded(
child: Container(
child: Divider(
height: 0.0,
thickness: 0.5,
color: Colors.grey.shade500,
),
),
),
],
),
),
SizedBox(height: 0.075 * SizingInfo.screenWidth),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircleButton(
onTap: () => print("Google"),
imagePath: 'assets/images/google.png',
),
SizedBox(width: 0.1 * SizingInfo.screenWidth),
CircleButton(
onTap: () => print("Facebook"),
imagePath: 'assets/images/facebook.png',
),
],
),
SizedBox(height: kSpacingUnit * 5.0),
],
),
),
),
),
Вот как выглядит экран:
Кто-нибудь, пожалуйста, может помочь с устранением этой проблемы. Заранее большое вам спасибо!
Обновить:
После применения решения, предложенного @Besufkd, контейнер застрял внизу, но под кнопками Google и Facebook появляются нежелательные пробелы, как показано на экранах ниже, не могли бы вы помочь мне с устранением этой проблемы:
Комментарии:
1. таким образом, вам не нужен нижний синий контейнер, вместо этого он должен отображать значки Fb и Google ниже.
2. Синий — это фон каркаса.
3. api.flutter.dev/flutter/material/BottomNavigationBar-class.html
Ответ №1:
проверьте это
Container(
child: Column(
children: [Expanded(
child: Container(),
),
// this will be you container
Container()
],
),
),
Комментарии:
1. Спасибо @Besufkad контейнер приклеен к нижней части, но под кнопками FB и Google много места. Я хочу избавиться от этого пространства.
2.
SizedBox(height: kSpacingUnit * 5.0),
затем удалите эту часть снизу3. Спасибо @Besufkad, я удалил его и прикрепил обновленный экран, но пробел все еще существует.
4. добавить
mainAxisAlignment: MainAxisAlignment.end
в столбец внутри SingleChildScrollView5. Извините @Besufkad, это не помогло. Я не уверен, из какого виджета отображается это пустое пространство.
Ответ №2:
новое расширенное (
child: new Align(
alignment: Alignment.bottomCenter,
child: Container(
height: 50,
width: 100,
color: Colors.blue,
child: new Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
new Text("Hello")
],
),
)))