Flutter - Drawer 抽屜視圖與自定義header

移動(dòng)開(kāi)發(fā)中,drawerLayout抽屜視圖是比較常用的一種控件。一般將用戶(hù)的頭像,用戶(hù)名等信息在抽屜視圖中呈現(xiàn)。
drawer中也可以提供一些選項(xiàng),比如跳轉(zhuǎn)去設(shè)置頁(yè),跳轉(zhuǎn)去用戶(hù)資料頁(yè)面等等。

Flutter提供了Drawer組件;結(jié)合ListView等組件,開(kāi)發(fā)者可以快速地制作出抽屜視圖。

使用material中的UserAccountsDrawerHeader

使用material中的UserAccountsDrawerHeader,設(shè)置accountNamecurrentAccountPicture

class MyHomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new _MyHomePageState();
  }
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    Widget userHeader = UserAccountsDrawerHeader(
      accountName: new Text('Tom'),
      accountEmail: new Text('tom@xxx.com'),
      currentAccountPicture: new CircleAvatar(
        backgroundImage: AssetImage('images/pic1.jpg'), radius: 35.0,),);

    return Scaffold(appBar: AppBar(title: Text("Home"),),
      body: new Center(child: new Text('Home page'),),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            userHeader , // 可在這里替換自定義的header
            ListTile(title: Text('Item 1'),
              leading: new CircleAvatar(child: new Icon(Icons.school),),
              onTap: () {
                Navigator.pop(context);
              },),
            ListTile(title: Text('Item 2'),
              leading: new CircleAvatar(child: new Text('B2'),),
              onTap: () {
                Navigator.pop(context);
              },),
            ListTile(title: Text('Item 3'),
              leading: new CircleAvatar(
                child: new Icon(Icons.list),),
              onTap: () {
                Navigator.pop(context);
              },),
          ],
        ),
      ),);
  }
}

使用UserAccountsDrawerHeader效果如下


使用UserAccountsDrawerHeader效果

UserAccountsDrawerHeader文檔請(qǐng)見(jiàn) https://docs.flutter.io/flutter/material/UserAccountsDrawerHeader-class.html

自定義header

Flutter有DrawerHeader,我們對(duì)其進(jìn)行自定義。

  • DrawerHeader設(shè)置padding為0,充滿(mǎn)整個(gè)頂部
  • DrawerHeader的child使用Stack,目的是放置背景圖片
  • Stack偏左下的位置放置頭像和用戶(hù)名
    • 先用Align確定對(duì)齊方式為FractionalOffset.bottomLeft
    • Align的child為Container,并設(shè)定一個(gè)具體高度
    • 頭像與文字的Container仿照ListTile的風(fēng)格,左邊是一個(gè)頭像,右邊是文字;使用Row來(lái)分隔頭像和文字
    • 文字部分先用Container的margin做出間隔,再放入一個(gè)Column來(lái)存放Text
    • 文字Column設(shè)置水平方向左對(duì)齊與豎直方向居中
    Widget header = DrawerHeader(
      padding: EdgeInsets.zero, /* padding置為0 */
      child: new Stack(children: <Widget>[ /* 用stack來(lái)放背景圖片 */
        new Image.asset(
          'images/p_h_r_600.png', fit: BoxFit.fill, width: double.infinity,),
        new Align(/* 先放置對(duì)齊 */
          alignment: FractionalOffset.bottomLeft,
          child: Container(
            height: 70.0,
            margin: EdgeInsets.only(left: 12.0, bottom: 12.0),
            child: new Row(
              mainAxisSize: MainAxisSize.min, /* 寬度只用包住子組件即可 */
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                new CircleAvatar(
                  backgroundImage: AssetImage('images/pic1.jpg'),
                  radius: 35.0,),
                new Container(
                  margin: EdgeInsets.only(left: 6.0),
                  child: new Column(
                    crossAxisAlignment: CrossAxisAlignment.start, // 水平方向左對(duì)齊
                    mainAxisAlignment: MainAxisAlignment.center, // 豎直方向居中
                    children: <Widget>[
                      new Text("Tom", style: new TextStyle(
                          fontSize: 20.0,
                          fontWeight: FontWeight.w400,
                          color: Colors.white),),
                      new Text("What's up", style: new TextStyle(
                          fontSize: 14.0, color: Colors.white),),
                    ],
                  ),
                ),
              ],),
          ),
        ),
      ]),);

自定義header的效果圖


自定義header的效果圖

在自定義header的過(guò)程中,我們組合使用了多種widget;
有層疊的Stack,用于對(duì)齊的Align,設(shè)定具體尺寸和margin的Container,水平放置的Row以及豎直放置的Column。
這些widget的各有特點(diǎn),根據(jù)具體情況來(lái)組合使用。同一個(gè)UI效果,做法也不止一種。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容