Flutter 将徽标添加到颤振布局
我对FlitterUI设计是全新的,我正试图在登录屏幕上添加一个徽标。我浏览了一个关于登录屏幕的教程,并让它工作,但我无法得到一个位于表单上方中心的徽标。我仔细阅读了其他教程和布局漫游,但都不正确。该教程有一个背景图像,我可以找出,但我们只是想要的标志。这是省道代码Flutter 将徽标添加到颤振布局,flutter,flutter-layout,Flutter,Flutter Layout,我对FlitterUI设计是全新的,我正试图在登录屏幕上添加一个徽标。我浏览了一个关于登录屏幕的教程,并让它工作,但我无法得到一个位于表单上方中心的徽标。我仔细阅读了其他教程和布局漫游,但都不正确。该教程有一个背景图像,我可以找出,但我们只是想要的标志。这是省道代码 import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:lbconnect/auth.dart'; import 'package:lbco
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:lbconnect/auth.dart';
import 'package:lbconnect/data/database_helper.dart';
import 'package:lbconnect/models/user.dart';
import 'package:lbconnect/screens/login_screen_presenter.dart';
class LoginScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return new LoginScreenState();
}
}
class LoginScreenState extends State<LoginScreen>
implements LoginScreenContract, AuthStateListener {
BuildContext _ctx;
bool _isLoading = false;
final formKey = new GlobalKey<FormState>();
final scaffoldKey = new GlobalKey<ScaffoldState>();
String _password;
String _username;
LoginScreenPresenter _presenter;
LoginScreenState() {
_presenter = new LoginScreenPresenter(this);
var authStateProvider = new AuthStateProvider();
authStateProvider.subscribe(this);
}
void _submit() {
final form = formKey.currentState;
if (form.validate()) {
setState(() => _isLoading = true);
form.save();
_presenter.doLogin(_username, _password);
}
}
void _showSnackBar(String text) {
scaffoldKey.currentState
.showSnackBar(new SnackBar(content: new Text(text)));
}
@override
onAuthStateChanged(AuthState state) {
if(state == AuthState.LOGGED_IN)
Navigator.of(_ctx).pushReplacementNamed("/home");
}
@override
Widget build(BuildContext context) {
_ctx = context;
var loginBtn = new RaisedButton(
onPressed: _submit,
child: new Text("LOGIN"),
color: Colors.white,
);
var loginForm = new Column(
children: <Widget>[
new Form(
key: formKey,
child: new Column(
children: <Widget>[
new Padding(
padding: const EdgeInsets.all(8.0),
child: new TextFormField(
onSaved: (val) => _username = val,
validator: (val) {
return val.length < 10
? "Username must have atleast 10 chars"
: null;
},
decoration: new InputDecoration(labelText: "EMAIL"),
),
),
new Padding(
padding: const EdgeInsets.all(8.0),
child: new TextFormField(
onSaved: (val) => _password = val,
decoration: new InputDecoration(labelText: "PASSWORD"),
),
),
],
),
),
_isLoading ? new CircularProgressIndicator() : loginBtn
],
crossAxisAlignment: CrossAxisAlignment.center,
);
return new Scaffold(
appBar: null,
key: scaffoldKey,
body: new Container(
decoration: new BoxDecoration(
color: Colors.blue,
),
child: new Center(
child: new ClipRect(
child: new BackdropFilter(
filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
child: new Container(
child: loginForm,
height: 300.0,
width: 300.0,
decoration: new BoxDecoration(
color: Colors.transparent,
)
),
),
),
),
),
);
如果使用资产图像,请在代码中添加此项,并确保要插入的徽标应位于资产中。有关更多信息,请访问。 我希望它能帮你做你想要的:)
Widget ui(){
返回列(
儿童:[
尺寸箱(高度:50.0),
装饰盒(
装饰:盒子装饰(
图像:装饰图像(
图像:AssetImage('graphics/logo.png')
)
新形式(
key:formKey,
子:新列(
.........
...........
);
}
好吧,有两种方法可以做到这一点:一种是使用列小部件,其中任何包装到列中的小部件都垂直对齐。默认情况下,列中的所有内容都填充到中心
Column(
children: <Widget>[
LogoWidget(),
EmailWidget(),
PasswordWidget(),
ButtonWidget(),
],
),
列(
儿童:[
LogoWidget(),
EmailWidget(),
PasswordWidget(),
ButtonWidget(),
],
),
但这将从页面顶部开始,您可以通过将其包装在容器中来提供一些边距,但给它一些硬编码值不是一个好主意,
我所知道的最好的方法是将Flex与扩展的Widget一起使用,您可以指定某个特定的Widget使用了多少屏幕空间,并且在所有屏幕大小上都能很好地工作
Column(
children: <Widget>[
Expanded(
child: Container(), // empty container to leave some space at the top
flex: 2,
)
Expanded(
child: LogoWidget(),
flex: 3,
),
Expanded(
child: EmailWidget(),
flex: 2,
),
Expanded(
child: PasswordWidget(),
flex: 2,
),
Expanded(
child: ButtonWidget(),
flex: 2,
),
Expanded(
child: Container(), // empty container to leave some space at bottom
flex: 2,
)
],
),
列(
儿童:[
扩大(
child:Container(),//空容器以在顶部留下一些空间
弹性:2,
)
扩大(
子项:LogoWidget(),
弹性:3,
),
扩大(
子项:EmailWidget(),
弹性:2,
),
扩大(
子项:PasswordWidget(),
弹性:2,
),
扩大(
子项:ButtonWidget(),
弹性:2,
),
扩大(
child:Container(),//空容器以在底部留下一些空间
弹性:2,
)
],
),
只需使用flex值,这将为您提供结果,这是一种使用flutter构建布局的有趣方式
我建议你阅读这篇文章来了解更多关于颤振布局的信息
绝对正确。我将添加一张图片。没有代码,因为我添加的内容破坏了应用程序:(基本上,我们需要我们的徽标集中在登录表单上方的应用程序顶部。我在需要的位置添加了一个带有徽标的屏幕截图。感谢帮助,我是否在新表单之前添加此图标?我不知道要添加此图标的确切位置,我在我的版本中为按钮和表单声明了一个var。
Column(
children: <Widget>[
LogoWidget(),
EmailWidget(),
PasswordWidget(),
ButtonWidget(),
],
),
Column(
children: <Widget>[
Expanded(
child: Container(), // empty container to leave some space at the top
flex: 2,
)
Expanded(
child: LogoWidget(),
flex: 3,
),
Expanded(
child: EmailWidget(),
flex: 2,
),
Expanded(
child: PasswordWidget(),
flex: 2,
),
Expanded(
child: ButtonWidget(),
flex: 2,
),
Expanded(
child: Container(), // empty container to leave some space at bottom
flex: 2,
)
],
),