1. 程式人生 > >Flutter學習筆記(18)--Drawer抽屜元件

Flutter學習筆記(18)--Drawer抽屜元件

如需轉載,請註明出處:Flutter學習筆記(18)--Drawer抽屜元件

Drawer(抽屜元件)可以實現類似抽屜拉出和推入的效果,可以從側邊欄拉出導航面板。通常Drawer是和ListView元件組合使用的。

Drawer元件屬性及說明
屬性名 型別 預設值 說明
child Widget   Drawer的child可以放置任意可顯示的物件
elevation double 16 墨紙設計中元件的z座標順序

 

 

 

 

 

 

 

Drawer元件可以新增頭部效果,用DrawerHeader和UserAccountsDrawerHeader這兩個元件可以實現。

DrawerHeader:展示基本資訊

UserAccountsDraweHeader:展示使用者頭像、使用者名稱、Email等資訊

 

DrawerHeader元件屬性及描述
屬性名 型別 說明
decoration Decoration header區域的decoration,通常用來設定背景顏色或者背景圖片
curve Curve 如果decoration發生了變化,則會使用curve設定的變化曲線和duration設定的動畫時間來做一個切換動畫
child Widget header裡面所顯示的內容控制元件
padding EdgeInsetsGeometry header裡面內容控制元件的padding指。如果child為null的話,則這個值無效
margin EdgeInsetsGeometry header四周的間隙

 

 

 

 

 

 

 

 

 

UserAccountsDrawerHeader元件屬性及說明
屬性名 型別 說明
margin EdgeInsetsGeometry Header四周的間隙
decoration Decoration header區域的decoration,通常用來設定背景顏色或者背景圖片
currentAccountPicture Widget 用來設定當前使用者的頭像
otherAccountsPictures List<Widget> 用來設定當前使用者其他賬號的頭像
accountName Widget 當前使用者名稱
accountEmail Widget 當前使用者Email
onDetailsPressed VoidCallBack 當accountName或accountEmail被點選的時候所觸發的回撥函式,可以用來顯示其他額外的資訊

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Demo示例:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget{
  final List<Tab> _mTabs = <Tab>[
    Tab(text: 'Tab1',icon: Icon(Icons.airline_seat_flat_angled),),
    Tab(text: 'Tab2',icon: Icon(Icons.airline_seat_flat_angled),),
    Tab(text: 'Tab3',icon: Icon(Icons.airline_seat_flat_angled),),
  ];
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Drawer Demo',
      home: DefaultTabController(
          length: _mTabs.length,
          child: new Scaffold(
            appBar: new AppBar(
              //自定義Drawer的按鈕
              leading: Builder(
                  builder: (BuildContext context){
                    return IconButton(
                        icon: Icon(Icons.wifi_tethering),
                        onPressed: (){
                          Scaffold.of(context).openDrawer();
                        }
                    );
                  }
              ),
              title: new Text('Drawer Demo'),
              backgroundColor: Colors.cyan,
              bottom: new TabBar(
                  tabs: _mTabs
              ),
            ),
            body: new TabBarView(
                children: _mTabs.map((Tab tab){
                  return new Center(
                    child: new Text(tab.text),
                  );
                }).toList()
            ),
            drawer: Drawer(
              child: ListView(
                children: <Widget>[
                  Container(
                    height: 150,
                    child: UserAccountsDrawerHeader(
                        //設定使用者名稱
                        accountName: new Text('Drawer Demo 抽屜元件'),
                        //設定使用者郵箱
                        accountEmail: new Text('www.baidu.com'),
                        //設定當前使用者的頭像
                        currentAccountPicture: new CircleAvatar(
                          backgroundImage: new AssetImage('images/timg.jpg'),
                        ),
                        //回撥事件
                        onDetailsPressed: (){
                        },
                    ),
                  ),
                  ListTile(
                    leading: Icon(Icons.wifi),
                    title: new Text('無線網路1'),
                    subtitle: new Text('我是副標題'),
                  ),
                  ListTile(
                    leading: Icon(Icons.wifi),
                    title: new Text('無線網路2'),
                    subtitle: new Text('我是副標題'),
                  ),
                  ListTile(
                    leading: Icon(Icons.wifi),
                    title: new Text('無線網路3'),
                    subtitle: new Text('我是副標題'),
                    onTap: (){
                      print('ssss');
                    },
                  ),
                  ListTile(
                    leading: Icon(Icons.wifi),
                    title: new Text('無線網路4'),
                    subtitle: new Text('我是副標題'),
                  ),
                ],
              ),
            ),
          )
      ),
    );
  }
}

 

效果截圖:

Demo感覺沒什麼好解釋的,就是一般的簡單用法,特別說一下,新增Drawer元件,Scaffold會自動給我們生成一個Drawer的按鈕,如果我們在appBar中手動設定leading,確實是會更改這個按鈕的圖示,但是點選這個圖示就不會彈出Drawer了,所以如果我們有需要自定義Drawer的圖示的話,需要如下處理:

            leading: Builder(
                  builder: (BuildContext context){
                    return IconButton(
                        icon: Icon(Icons.wifi_tethering),
                        onPressed: (){
                          Scaffold.of(context).openDrawer();
                        }
                    );
                  }
              ),    

&n