Flutter入門(13):Flutter 組件之 Scaffold 詳解

1. 基本介紹

Scaffold 提供了比較常見的頁面屬性按摘。

Scaffold屬性 介紹
appBar 頁面上方導航條
body 頁面容器
floatingActionButton 懸浮按鈕
floatingActionButtonLocation 懸浮按鈕位置
floatingActionButtonAnimator 懸浮按鈕動畫
persistentFooterButtons 顯示在底部導航條上方的一組按鈕
drawer 左側菜單
endDrawer 右側菜單
bottomNavigationBar 底部導航條
bottomSheet 一個持久停留在body下方腔寡,底部控件上方的控件
backgroundColor 背景色
resizeToAvoidBottomPadding 已廢棄,resizeToAvoidBottomInset作為替代
resizeToAvoidBottomInset 默認為 true院塞,防止一些小組件重復
primary 是否在屏幕頂部顯示Appbar, 默認為 true体斩,Appbar 是否向上延伸到狀態(tài)欄剿吻,如電池電量,時間那一欄
drawerDragStartBehavior 控制 drawer 的一些特性
extendBody body 是否延伸到底部控件
extendBodyBehindAppBar 默認 false讯檐,為 true 時,body 會置頂到 appbar 后染服,如appbar 為半透明色别洪,可以有毛玻璃效果
drawerScrimColor 側滑欄拉出來時,用來遮蓋主頁面的顏色
drawerEdgeDragWidth 側滑欄拉出來的寬度
drawerEnableOpenDragGesture 左側側滑欄是否可以滑動
endDrawerEnableOpenDragGesture 右側側滑欄是否可以滑動

2. 示例代碼

代碼下載地址肌索。如果對你有幫助的話記得給個關注蕉拢,代碼會根據我的 Flutter 專題不斷更新。

3. Scaffold 組件

3.1 創(chuàng)建容器

優(yōu)雅的編程诚亚,首先創(chuàng)建一個 scaffold.dart 文件晕换。

import 'package:flutter/material.dart';

class FMScaffoldVC extends StatefulWidget {
  FMScaffoldVC({Key key}) : super(key: key);
  @override
  FMScaffoldState createState() => FMScaffoldState();
}

class FMScaffoldState extends State<FMScaffoldVC> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
      ),
    );
  }

  AppBar _appBar(){
    return AppBar(
      title: Text('Scaffold'),
      backgroundColor: Colors.lightBlue,
    );
  }

  Container _body(){
    return Container(
      color: Colors.grey,
    );
  }
}

3.2 AppBar

scaffold appBar.png

3.3 floatingActionButton

我們給這個按鈕增加一個返回事件,避免在使用其他屬性時站宗,導致頁面缺失返回事件闸准。

  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
        floatingActionButton: _floatingActionButton(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
      ),
    );
  }

  FloatingActionButton _floatingActionButton(){
    return FloatingActionButton(
      child: Text('返回'),
      onPressed: (){
        Navigator.pop(context);
      },
    );
  }

使用 floatingActionButtonLocation 可以改變按鈕位置,可以自行嘗試梢灭。


scaffold floatingActionButton.png

3.3 persistentFooterButtons

    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
        floatingActionButton: _floatingActionButton(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
        persistentFooterButtons: _persistentFooterButtons(),
      ),
    );
  }

  List<Widget> _persistentFooterButtons(){
    return [
      Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
      Container(
        width: 100,
        height: 100,
        color: Colors.green,
      ),
      Container(
        width: 100,
        height: 100,
        color: Colors.cyan,
      ),
    ];
  }
scaffold persistentFooterButtons.png

3.4 drawer / endDrawer

drawer / endDrawer 可以通過點擊左上角夷家,右上角按鍵觸發(fā),也可以左滑敏释,右滑觸發(fā)库快。
drawerEnableOpenDragGesture 默認為 true,設置 drawer 是否右滑觸發(fā)
endDrawerEnableOpenDragGesture 默認為 true钥顽,設置 endDrawer 是否左滑觸發(fā)

  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
        floatingActionButton: _floatingActionButton(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
        persistentFooterButtons: _persistentFooterButtons(),
        drawer: Drawer(),
        endDrawer: Drawer(),
      ),
    );
  }
scaffold drawer home.png

scaffold drawer.png

scaffold enddrawer.png

3.5 bottomNavigationBar

  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
        floatingActionButton: _floatingActionButton(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
        persistentFooterButtons: _persistentFooterButtons(),
        drawer: Drawer(),
        endDrawer: Drawer(),
        bottomNavigationBar: _bottomNavigationBar(),
      ),
    );
  }

  BottomNavigationBar _bottomNavigationBar(){
    return BottomNavigationBar(
      items: [
        BottomNavigationBarItem(
          icon: Icon(
              Icons.home
          ),
          title: Text('home'),
        ),
        BottomNavigationBarItem(
          icon: Icon(
              Icons.favorite
          ),
          title: Text('favorite'),
        ),
        BottomNavigationBarItem(
          icon: Icon(
              Icons.accessible
          ),
          title: Text('accessible'),
        ),
      ],
    );
  }
scaffold bottomNavigationBar.png

3.6 bottomSheet

  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
        floatingActionButton: _floatingActionButton(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
        persistentFooterButtons: _persistentFooterButtons(),
        drawer: Drawer(),
        endDrawer: Drawer(),
        bottomNavigationBar: _bottomNavigationBar(),
        bottomSheet: _bottomSheet(),
      ),
    );
  }

  BottomSheet _bottomSheet(){
    return BottomSheet(
        onClosing: (){},
        builder: (BuildContext context){
          return Container(
            height: 60,
            color: Colors.cyan,
            child: Text('Bottom Sheet'),
            alignment: Alignment.center,
          );
        },
    );
scaffold bottomSheet.png

3.7 backgroundColor

  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      child: Scaffold(
        appBar: _appBar(),
        body: _body(),
        floatingActionButton: _floatingActionButton(),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
        persistentFooterButtons: _persistentFooterButtons(),
        drawer: Drawer(),
        endDrawer: Drawer(),
        bottomNavigationBar: _bottomNavigationBar(),
        bottomSheet: _bottomSheet(),
      backgroundColor: Colors.yellow,
      ),
    );
  }
scaffold backgroundColor.png

3.8 其他屬性

還有一些 bool 值屬性义屏,用的場景較少,有需要的自行了解蜂大。

4. 技術小結

  • 了解 Scaffold 提供了哪些控件闽铐。
  • Scaffold 屬性介紹。
  • 基礎 Scaffold 控件的使用奶浦。
  • 基礎 Scaffold 的布局效果兄墅。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末奸柬,一起剝皮案震驚了整個濱河市蜜托,隨后出現的幾起案子停巷,更是在濱河造成了極大的恐慌,老刑警劉巖患亿,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坤检,死亡現場離奇詭異蕊爵,居然都是意外死亡浊闪,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門概荷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秕岛,“玉大人,你說我怎么就攤上這事误证〖萄Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵愈捅,是天一觀的道長遏考。 經常有香客問我,道長蓝谨,這世上最難降的妖魔是什么灌具? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮譬巫,結果婚禮上咖楣,老公的妹妹穿的比我還像新娘。我一直安慰自己芦昔,他們只是感情好诱贿,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咕缎,像睡著了一般珠十。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凭豪,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天焙蹭,我揣著相機與錄音,去河邊找鬼嫂伞。 笑死孔厉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的末早。 我是一名探鬼主播烟馅,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼说庭,長吁一口氣:“原來是場噩夢啊……” “哼然磷!你這毒婦竟也來了?” 一聲冷哼從身側響起刊驴,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤姿搜,失蹤者是張志新(化名)和其女友劉穎寡润,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體舅柜,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梭纹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了致份。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片变抽。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氮块,靈堂內的尸體忽然破棺而出绍载,到底是詐尸還是另有隱情,我是刑警寧澤滔蝉,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布击儡,位于F島的核電站,受9級特大地震影響蝠引,放射性物質發(fā)生泄漏阳谍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一螃概、第九天 我趴在偏房一處隱蔽的房頂上張望矫夯。 院中可真熱鬧,春花似錦谅年、人聲如沸茧痒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旺订。三九已至,卻和暖如春超燃,著一層夾襖步出監(jiān)牢的瞬間区拳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工意乓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留樱调,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓届良,卻偏偏與公主長得像笆凌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子士葫,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348