Flutter 将徽标添加到颤振布局

Flutter 将徽标添加到颤振布局,flutter,flutter-layout,Flutter,Flutter Layout,我对FlitterUI设计是全新的,我正试图在登录屏幕上添加一个徽标。我浏览了一个关于登录屏幕的教程,并让它工作,但我无法得到一个位于表单上方中心的徽标。我仔细阅读了其他教程和布局漫游,但都不正确。该教程有一个背景图像,我可以找出,但我们只是想要的标志。这是省道代码 import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:lbconnect/auth.dart'; import 'package:lbco

我对FlitterUI设计是全新的,我正试图在登录屏幕上添加一个徽标。我浏览了一个关于登录屏幕的教程,并让它工作,但我无法得到一个位于表单上方中心的徽标。我仔细阅读了其他教程和布局漫游,但都不正确。该教程有一个背景图像,我可以找出,但我们只是想要的标志。这是省道代码

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,
          )
        ],
      ),