Flutter 07: 圖解【登錄】頁(yè)面小優(yōu)化

??????小菜前兩天花了很久才搭建了一個(gè)最簡(jiǎn)單的【登錄】頁(yè)面幔烛,但依然還有很多需要優(yōu)化的地方赘淮,小菜又花了很久的時(shí)間嘗試做了一點(diǎn)點(diǎn)的優(yōu)化,僅針對(duì)優(yōu)化的部分簡(jiǎn)單整理一下碉考。


優(yōu)化一:解決 OverFlowed 遮擋文本框問(wèn)題

  1. 小菜剛開(kāi)始在編輯內(nèi)容塊 content 時(shí)占锯,以為涉及的 widget 元素不多袒哥,所占不會(huì)超過(guò)屏幕,所以根 widget 使用的是 body: new Container()消略,但是在點(diǎn)擊文本框 TextField 時(shí)堡称,彈出的鍵盤會(huì)擋住部分 widget,并提示 Bottom OverFlowed By 85 pixels艺演,如圖:

  2. 小菜查了一下官網(wǎng)却紧,調(diào)整方式很簡(jiǎn)單,將根 widget 調(diào)整為 body: new ListView()胎撤,Flutter 中的 ListView 不僅代表列表 (ListView/RecycleView)啄寡,還可以代表一個(gè)可滑動(dòng)布局 (ScrollView),如圖:

優(yōu)化二:文本框 TextField 中尾部添加【清空數(shù)據(jù)】圖標(biāo)

方式一:使用層布局 Stack哩照,在輸入文本框 TextField 上一層添加一個(gè)【清空數(shù)據(jù)】圖標(biāo);
new Padding(
  padding: new EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 15.0),
  child: new Stack(
    alignment: new Alignment(1.0, 1.0),
    //statck
    children: <Widget>[
      new Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            new Padding(
              padding:
                  new EdgeInsets.fromLTRB(0.0, 0.0, 5.0, 0.0),
              child: new Image.asset(
                'images/icon_username.png',
                width: 40.0,
                height: 40.0,
                fit: BoxFit.fill,
              ),
            ),
            new Expanded(
              child: new TextField(
                controller: _phonecontroller,
                keyboardType: TextInputType.phone,
                decoration: new InputDecoration(
                  hintText: '請(qǐng)輸入用戶名',
                ),
              ),
            ),
          ]),
      new IconButton(
        icon: new Icon(Icons.clear, color: Colors.black45),
        onPressed: () {
          _phonecontroller.clear();
        },
      ),
    ],
  ),
),
方式二:使用文本框 TextField 自帶的屬性【后綴圖標(biāo) suffixIcon】懒浮,文本框 TextField 提供了很多便利的屬性飘弧,例如:【前綴圖標(biāo) prefixIcon】【文本框前圖標(biāo) icon】;
new Expanded(
  child: new TextField(
    controller: _pwdcontroller,
    decoration: new InputDecoration(
      hintText: '請(qǐng)輸入密碼',
      suffixIcon: new IconButton(
        icon: new Icon(Icons.clear,
            color: Colors.black45),
        onPressed: () {
          _pwdcontroller.clear();
        },
      ),
    ),
    obscureText: true,
  ),
),

??????Tips: 小菜更傾向于方法二砚著,方法一采用的是層布局次伶,如果超過(guò)圖標(biāo)所在位置,若不做特別處理稽穆,之后輸入的內(nèi)容會(huì)被圖標(biāo)擋住冠王,而且相較于方法二使用了更多的 widget。小菜為了測(cè)試舌镶,在【輸入用戶名】模塊采用了方法一柱彻,【輸入密碼】模塊采用了方法二豪娜。

優(yōu)化三:調(diào)整鍵盤彈出樣式

??????設(shè)置文本框 TextField 中 keyboardType: TextInputType.phone, Flutter 提供了多種彈出鍵盤的方式:text/datetime/phone/url/number/multiline/emailAddress...

鍵盤樣式.png
phone

優(yōu)化四:根據(jù)輸入文本框添加【溫馨提示】對(duì)話框

??????Flutter 提供了創(chuàng)建和顯示彈出對(duì)話框的功能,如:showDialog/showMenu/showModalBottomSheet 等哟楷,小菜采用的是對(duì)話框方式瘤载,可設(shè)置標(biāo)題/內(nèi)容/按鈕等各屬性。
??????Tips: 對(duì)話框中 barrierDismissible: false, 屬性卖擅,若為false鸣奔,點(diǎn)擊對(duì)話框周圍,對(duì)話框不會(huì)關(guān)閉惩阶;若為true挎狸,點(diǎn)擊對(duì)話框周圍,對(duì)話框自動(dòng)關(guān)閉断楷。

相關(guān)注意

??????Flutter 提供了很多便利的小圖標(biāo)锨匆,使用起來(lái)非常方便,小菜但就一個(gè)小【×】找到了好幾個(gè)類似的圖脐嫂,希望可以多多嘗試统刮,體驗(yàn)一下。如圖:

主要源碼

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: '輕簽到',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: '極速登錄'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _phoneState, _pwdState = false;
  String _checkStr;
  TextEditingController _phonecontroller = new TextEditingController();
  TextEditingController _pwdcontroller = new TextEditingController();

  void _checkPhone() {
    if (_phonecontroller.text.isNotEmpty &&
        _phonecontroller.text.trim().length == 11) {
      _phoneState = true;
    } else {
      _phoneState = false;
    }
  }

  void _checkPwd() {
    if (_pwdcontroller.text.isNotEmpty &&
        _pwdcontroller.text.trim().length >= 6 &&
        _pwdcontroller.text.trim().length <= 10) {
      _pwdState = true;
    } else {
      _pwdState = false;
    }
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: '輕簽到',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('極速登錄'),
        ),
        body: new ListView(
          children: <Widget>[
            new Column(
              mainAxisSize: MainAxisSize.max,
              mainAxisAlignment: MainAxisAlignment.start,

              children: <Widget>[
                new Padding(
                    padding: new EdgeInsets.all(30.0),
                    child: new Image.asset(
                      'images/ic_launcher.png',
                      scale: 1.2,
                    )),
                new Padding(
                  padding: new EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 15.0),
                  child: new Stack(
                    alignment: new Alignment(1.0, 1.0),
                    //statck
                    children: <Widget>[
                      new Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: [
                            new Padding(
                              padding:
                                  new EdgeInsets.fromLTRB(0.0, 0.0, 5.0, 0.0),
                              child: new Image.asset(
                                'images/icon_username.png',
                                width: 40.0,
                                height: 40.0,
                                fit: BoxFit.fill,
                              ),
                            ),
                            new Expanded(
                              child: new TextField(
                                controller: _phonecontroller,
                                keyboardType: TextInputType.phone,
                                decoration: new InputDecoration(
                                  hintText: '請(qǐng)輸入用戶名',
                                ),
                              ),
                            ),
                          ]),
                      new IconButton(
                        icon: new Icon(Icons.clear, color: Colors.black45),
                        onPressed: () {
                          _phonecontroller.clear();
                        },
                      ),
                    ],
                  ),
                ),
                new Padding(
                  padding: new EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 40.0),
                  child: new Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        new Padding(
                          padding: new EdgeInsets.fromLTRB(0.0, 0.0, 5.0, 0.0),
                          child: new Image.asset(
                            'images/icon_password.png',
                            width: 40.0,
                            height: 40.0,
                            fit: BoxFit.fill,
                          ),
                        ),
                        new Expanded(
                          child: new TextField(
                            controller: _pwdcontroller,
                            decoration: new InputDecoration(
                              hintText: '請(qǐng)輸入密碼',
                              suffixIcon: new IconButton(
                                icon: new Icon(Icons.clear,
                                    color: Colors.black45),
                                onPressed: () {
                                  _pwdcontroller.clear();
                                },
                              ),
                            ),
                            obscureText: true,
                          ),
                        ),
                      ]),
                ),
                new Container(
                  width: 340.0,
                  child: new Card(
                    color: Colors.blue,
                    elevation: 16.0,
                    child: new FlatButton(
                      child: new Padding(
                        padding: new EdgeInsets.all(10.0),
                        child: new Text(
                          '極速登錄',
                          style: new TextStyle(
                              color: Colors.white, fontSize: 16.0),
                        ),
                      ),
                      onPressed: () {
                        _checkPhone();
                        _checkPwd();
                        if (_phoneState && _pwdState) {
                          _checkStr = '頁(yè)面跳轉(zhuǎn)下期見(jiàn)咯账千!';
                        } else {
                          if (!_phoneState) {
                            _checkStr = '請(qǐng)輸入11位手機(jī)號(hào)侥蒙!';
                          } else if (!_pwdState) {
                            _checkStr = '請(qǐng)輸入6-10位密碼!';
                          }
                        }
                        print(_checkStr);
                        showDialog<Null>(
                          context: context,
                          barrierDismissible: false,
                          child: new AlertDialog(
                            title: new Text(
                              '溫馨提示',
                              style: new TextStyle(
                                color: Colors.black54,
                                fontSize: 18.0,
                              ),
                            ),
                            content: new Text(_checkStr),
                            actions: <Widget>[
                              new FlatButton(
                                  onPressed: () {
                                    Navigator.pop(context);
                                  },
                                  child: new Text('確定')),
                            ],
                          ),
                        );
                      },
                    ),
                  ),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

??????GitHub Demo


??????小菜也是剛接觸 Flutter匀奏,還有很多不清楚和不理解的地方鞭衩,如果又不對(duì)的地方還希望多多指出。

來(lái)源:阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娃善,一起剝皮案震驚了整個(gè)濱河市论衍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聚磺,老刑警劉巖坯台,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘫寝,居然都是意外死亡蜒蕾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門焕阿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咪啡,“玉大人,你說(shuō)我怎么就攤上這事暮屡。” “怎么了准夷?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵冕象,是天一觀的道長(zhǎng)渐扮。 經(jīng)常有香客問(wèn)我墓律,道長(zhǎng),這世上最難降的妖魔是什么察纯? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任饼记,我火速辦了婚禮具则,結(jié)果婚禮上具帮,老公的妹妹穿的比我還像新娘蜂厅。我一直安慰自己掘猿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般唧龄。 火紅的嫁衣襯著肌膚如雪奸远。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天耽梅,我揣著相機(jī)與錄音胖烛,去河邊找鬼佩番。 笑死趟畏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的利朵。 我是一名探鬼主播绍弟,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晌柬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼年碘!你這毒婦竟也來(lái)了屿衅?” 一聲冷哼從身側(cè)響起莹弊,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤响迂,失蹤者是張志新(化名)和其女友劉穎细疚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贫途,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丢早,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凫碌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛险。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苦掘,死狀恐怖鹤啡,靈堂內(nèi)的尸體忽然破棺而出蹲嚣,到底是詐尸還是另有隱情隙畜,我是刑警寧澤议惰,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布言询,位于F島的核電站运杭,受9級(jí)特大地震影響辆憔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望营搅。 院中可真熱鬧转质,春花似錦帖世、人聲如沸日矫。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)珊膜。三九已至辅搬,卻和暖如春堪遂,著一層夾襖步出監(jiān)牢的瞬間溶褪,已是汗流浹背猿妈。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鳍刷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留输瓜,地道東北人尤揣。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嗜愈,于是被迫代替她去往敵國(guó)和親芝硬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容