Flutter编写一个简单登录界面

首先来看一下效果图


注意事项:

        动态改变Widget,需要使用StatefulWidget,在更新Widget时,使用setState就行。废话不说,上代码:


import 'package:flutter/material.dart';

import 'dart:io';

import 'package:flutter/services.dart';

var usernameController = new TextEditingController();

var passworkController = new TextEditingController();

String userName;

String passwork;

bool checkboxSelected;

void main() {

  runApp(MyApp());

  if (Platform.isAndroid) {

    // 以下两行 设置android状态栏为透明的沉浸。写在组件渲染之后,是为了在渲染后进行set赋值,覆盖状态栏,写在渲染之前MaterialApp组件会覆盖掉这个值。

    SystemUiOverlayStyle systemUiOverlayStyle =

        SystemUiOverlayStyle(statusBarColor: Colors.transparent);

    SystemChrome.setSystemUIOverlayStyle(

        systemUiOverlayStyle.copyWith(statusBarBrightness: Brightness.light));

    // SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light

    //    .copyWith(statusBarBrightness: Brightness.light));

  }

}

class MyApp extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return MaterialApp(

      home: Scaffold(

        body: SingleChildScrollView(

          child: Column(

            //MainAxisSize在主轴方向占有空间的值,默认是max。还有一个min

            mainAxisSize: MainAxisSize.max,

            //MainAxisAlignment:主轴方向上的对齐方式,会对child的位置起作用,默认是start。

            mainAxisAlignment: MainAxisAlignment.start,

            children: <Widget>[

              iconImg(),

              editWidget(),

              bt_Widget(),

              radioBt_Widget(),

            ],

          ),

        ),

      ),

    );

  }

}

/**

* icon界面

*/

class iconImg extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    // TODO: implement build

    return Container(

      alignment: Alignment.topCenter,

      child: Container(

        decoration: BoxDecoration(

            borderRadius: new BorderRadius.circular((20.0)), // 圆角度

            boxShadow: [

              ///阴影颜色/位置/大小等

              BoxShadow(

                color: Colors.grey[300],

                offset: Offset(1, 1),

                ///模糊阴影半径

                blurRadius: 10,

              ),

              BoxShadow(

                  color: Colors.grey[300],

                  offset: Offset(-1, -1),

                  blurRadius: 5),

              BoxShadow(

                  color: Colors.grey[200],

                  offset: Offset(1, -1),

                  blurRadius: 10),

              BoxShadow(

                  color: Colors.grey[100],

                  offset: Offset(-1, 1),

                  blurRadius: 10)

            ],

            border: Border.all(

              width: 1.0,

              color: Color(0xFFE0E0E0),

            )),

        margin: EdgeInsets.only(top: 60.0),

        child: Container(

          decoration: BoxDecoration(

            borderRadius: new BorderRadius.circular((20.0)), // 圆角度

            color: Colors.white,

          ),

          child: Column(

            mainAxisSize: MainAxisSize.max,

            mainAxisAlignment: MainAxisAlignment.center,

            children: <Widget>[

              new Padding(

                padding: EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 10.0),

                child: Container(

                  width: 70.0,

                  height: 70.0,

                  child: Image.asset(

                    'images/icon.png',

                    scale: 2.85,

                    alignment: Alignment.center,

                  ),

                ),

              ),

            ],

          ),

        ),

      ),

    );

  }

}

class editWidget extends StatefulWidget {

  editWidget({Key key}) : super(key: key);

  @override

  _editWidget createState() => new _editWidget();

}

/**

* 输入框界面

*/

class _editWidget extends State<editWidget> {

  var userClearFlag = false;

  var pswClearFlag = false;

  @override

  Widget build(BuildContext context) {

    // TODO: implement build

    return Container(

      padding: EdgeInsets.fromLTRB(30.0, 5.0, 10.0, 10.0),

      child: Column(

        children: <Widget>[

          Container(

            alignment: Alignment.centerLeft,

            margin: EdgeInsets.only(bottom: 30.0, top: 100.0),

            child: Text(

              '用户登录',

              textAlign: TextAlign.left,

              style: TextStyle(fontSize: 22.0, color: Color(0xff333333)),

            ),

          ),

          Row(

            children: <Widget>[

              Image.asset(

                'images/user.png',

                width: 18.0,

              ),

              Expanded(

                child: Container(

                  margin: EdgeInsets.only(left: 10.0, right: 5.0),

                  child: TextField(

                    controller: usernameController,

                    maxLines: 1,

                    //是否自动更正

                    autocorrect: true,

                    //是否自动对焦

                    autofocus: false,

                    textInputAction: TextInputAction.unspecified,

                    decoration: InputDecoration(

                        hintStyle:

                            TextStyle(color: Color(0xffBFBFBF), fontSize: 16.0),

                        hintText: '请输入用户名',

                        border: InputBorder.none,

                        prefixStyle: TextStyle(

                            color: Color(0xff333333), fontSize: 16.0)),

                    onChanged: (val) {

                      setState(() {

                        pswClearFlag = false;

                        if (val.length > 0)

                          userClearFlag = true;

                        else

                          userClearFlag = false;

                      });

                      print(val);

                    },

                    onEditingComplete: () {

                      print('点击键盘');

                    },

                    onSubmitted: (val) {

                      print('完成${val}');

                    },

                  ),

                ),

              ),

              Offstage(

                offstage: !userClearFlag,

                child: GestureDetector(

                  child: Container(

                    margin: EdgeInsets.only(right: 10.0),

                    child: Image.asset(

                      'images/clear.png',

                      width: 15.0,

                    ),

                  ),

                  onTap: () {

                    print('清空');

                    usernameController.clear();

                  },

                ),

              ),

            ],

          ),

          Container(

            height: 1.0,

            margin: EdgeInsets.only(bottom: 40.0),

            decoration: BoxDecoration(

              border: Border.all(width: 1.0, color: Color(0xffD9D9D9)),

            ),

          ),

          Row(

            children: <Widget>[

              Image.asset(

                'images/psw.png',

                width: 18.0,

              ),

              Expanded(

                child: Container(

                  margin: EdgeInsets.only(left: 10.0, right: 5.0),

                  child: TextField(

                    controller: passworkController,

                    maxLines: 1,

                    //是否自动更正

                    autocorrect: true,

                    //是否自动对焦

                    autofocus: false,

                    // 是否是密码

                    obscureText: true,

                    textInputAction: TextInputAction.unspecified,

                    keyboardType: TextInputType.phone,

                    decoration: InputDecoration(

                        hintStyle:

                            TextStyle(color: Color(0xffBFBFBF), fontSize: 16.0),

                        prefixStyle:

                            TextStyle(color: Color(0xff333333), fontSize: 16.0),

                        hintText: '请输入密码',

                        border: InputBorder.none),

                    onChanged: (val) {

                      setState(() {

                        userClearFlag = false;

                        if (val.length > 0)

                          pswClearFlag = true;

                        else

                          pswClearFlag = false;

                      });

                      print(val);

                    },

                  ),

                ),

              ),

              Offstage(

                offstage: !pswClearFlag,

                child: GestureDetector(

                  child: Container(

                    margin: EdgeInsets.only(right: 10.0),

                    child: Image.asset(

                      'images/clear.png',

                      width: 15.0,

                    ),

                  ),

                  onTap: () {

                    passworkController.clear();

                  },

                ),

              ),

            ],

          ),

          Container(

            height: 1.0,

            decoration: BoxDecoration(

              border: Border.all(width: 1.0, color: Color(0xffD9D9D9)),

            ),

          ),

        ],

      ),

    );

  }

}

/**

* 登录按钮

*/

class bt_Widget extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    // TODO: implement build

    return GestureDetector(

      child: Container(

        margin:

            EdgeInsets.only(left: 30.0, right: 30.0, top: 50.0, bottom: 10.0),

        padding: EdgeInsets.only(top: 10.0, bottom: 10.0),

        decoration: BoxDecoration(

          borderRadius: BorderRadius.circular(20.0),

          color: Color(0xff3896FF),

          boxShadow: [

            ///阴影颜色/位置/大小等

            BoxShadow(

              color: Colors.grey[200],

              offset: Offset(1, 1),

              ///模糊阴影半径

              blurRadius: 10,

            ),

            BoxShadow(

                color: Colors.grey[200], offset: Offset(-1, -1), blurRadius: 5),

            BoxShadow(

                color: Colors.grey[200], offset: Offset(1, -1), blurRadius: 10),

            BoxShadow(

                color: Colors.grey[200], offset: Offset(-1, 1), blurRadius: 10)

          ],

        ),

        child: Row(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            Text(

              '登 录',

              style: TextStyle(fontSize: 16.0, color: Color(0xffffffff)),

              textAlign: TextAlign.center,

            ),

          ],

        ),

      ),

      onTap: () {

        showAlertDialog(context);

      },

    );

  }

  void showAlertDialog(BuildContext context) {

    showDialog(

        context: context,

        builder: (_) => new AlertDialog(

                title: new Text("Dialog Title"),

                content: new Text("This is my content"),

                actions: <Widget>[

                  new FlatButton(

                    child: new Text("CANCEL"),

                    onPressed: () {

                      Navigator.of(context).pop();

                    },

                  ),

                  new FlatButton(

                    child: new Text("OK"),

                    onPressed: () {

                      Navigator.of(context).pop();

                    },

                  )

                ]));

  }

}

class radioBt_Widget extends StatefulWidget {

  radioBt_Widget({Key key}) : super(key: key);

  @override

  _radioBt_Widget createState() => new _radioBt_Widget();

}

/**

* 记住密码单选框

*/

class _radioBt_Widget extends State<radioBt_Widget> {

  bool _checkboxSelected = true;

  @override

  Widget build(BuildContext context) {

    // TODO: implement build

    return Container(

      margin: EdgeInsets.only(left: 25.0, top: 15.0),

      child: GestureDetector(

        child: Row(

          mainAxisAlignment: MainAxisAlignment.start,

          children: <Widget>[

            Container(

              margin: EdgeInsets.only(right: 5.0),

              padding: EdgeInsets.only(top: 5.0, bottom: 5.0, left: 5.0),

              child: Image.asset(

                _checkboxSelected ? 'images/wu.png' : 'images/gou.png',

                width: 15.0,

              ),

            ),

            Text(

              '记住密码',

              style: TextStyle(fontSize: 14.0, color: Color(0xff333333)),

            )

          ],

        ),

        onTap: () {

          setState(() {

            _checkboxSelected = !_checkboxSelected;

          });

        },

      ),

    );

  }

}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容