Flutter深入淺出元件篇---Scaffold

Jimi發表於2021-08-22

Scaffold介紹

Scaffold 我們通常俗稱為腳手架,在前面的文章中我們說到,Material 元件(MDC)幫助開發者實現 Material DesignScaffold 實現了基本的 Material Design 佈局結構。在 Material 設計中定義的單個介面上的各種佈局元素,在 Scaffold 中都支援。

Scaffold在什麼情況下使用

​ 在每一個頁面中基本都需要用到Scaffold ,除非當你的頁面不需要導航區,但仍希望您使用 Scaffold 來作為每個頁面的頂級元件。

示例程式碼

本文中很多效果都沒有截圖,可下載原始碼執行專案 原始碼地址,或者通過視訊教程檢視 視訊教程地址

Scaffold屬性和說明

總共23個屬性

欄位屬性描述
appBarPreferredSizeWidget顯示腳手架的頂部導航區
bodyWidget顯示腳手架的主要內容
floatingActionButtonWidget懸浮按鈕,位於右下角
floatingActionButtonLocationFloatingActionButtonLocation決定懸浮按鈕的位置
floatingActionButtonAnimatorFloatingActionButtonAnimator決定懸浮按鈕的動畫
persistentFooterButtonsList顯示在腳手架底部的一組按鈕
drawerWidget左側抽屜選單元件
onDrawerChangedDrawerCallback左側抽屜選單改變事件回撥
endDrawerWidget右側抽屜選單元件
onEndDrawerChangedDrawerCallback右側抽屜選單改變事件回撥
bottomNavigationBarWidget底部導航條
bottomSheetWidget持久在body下方,底部控制元件上方的控制元件
backgroundColorColor腳手架背景顏色
resizeToAvoidBottomInsetbool防止小元件重複
primarybool腳手架是否延伸到頂部
drawerDragStartBehaviorDragStartBehavior檢測手勢行為方式,與drawer配合使用
extendBodybool是否延伸到底部
extendBodyBehindAppBarbool是否延伸到頂部,用於做半透明、毛玻璃效果的主要控制屬性
drawerScrimColorColor側邊欄彈出時非遮蓋層主頁面的顏色
drawerEdgeDragWidthdouble側邊欄彈出時非遮罩層的寬度
drawerEnableOpenDragGesturebool左側抽屜是否支援手勢滑動
endDrawerEnableOpenDragGesturebool右側抽屜是否支援手勢滑動
restorationIdString狀態還原識別符號

Scaffold屬性詳細使用

1、appBar

​ 顯示腳手架的頂部導航欄

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
);
複製程式碼

2、body

​ 顯示腳手架的主要內容

使用方法

Scaffold(
  appBar: AppBar(
  	title: Text("Scaffold"),
  ),
  body: Center(
  	child: Text("body"),
  ),
);
複製程式碼

3、floatingActionButton

​ 懸浮按鈕,預設位於右小角

使用方法

Scaffold(
  appBar: AppBar(
  	title: Text("Scaffold"),
  ),
  body: Center(
  	child: Text("body"),
  ),
  floatingActionButton: FloatingActionButton(
    onPressed: (){
   		print("add");
    },
    child: Icon(Icons.add)
  ),
);
複製程式碼

4、floatingActionButtonLocation

​ 決定懸浮按鈕的位置

使用方法

Scaffold(
  appBar: AppBar(
  	title: Text("Scaffold"),
  ),
  body: Center(
  	child: Text("body"),
  ),
  floatingActionButton: FloatingActionButton(
    onPressed: (){
   		print("add");
    },
    child: Icon(Icons.add)
  ),
  floatingActionButtonLocation: FloatingActionButtonLocation.miniCenterDocked,
);
複製程式碼

5、floatingActionButtonAnimator

​ 決定懸浮按鈕的動畫

使用方法

Scaffold(
  appBar: AppBar(
  	title: Text("Scaffold"),
  ),
  body: Center(
  	child: Text("body"),
  ),
  floatingActionButton: FloatingActionButton(
    onPressed: (){
   		print("add");
    },
    child: Icon(Icons.add)
  ),
  floatingActionButtonLocation: FloatingActionButtonLocation.miniCenterDocked,
  floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
);
複製程式碼

6、persistentFooterButtons

​ 顯示在腳手架底部的一組按鈕

使用方法

Scaffold(
  appBar: AppBar(
  	title: Text("Scaffold"),
  ),
  body: Center(
  	child: Text("body"),
  ),
	persistentFooterButtons: [
    TextButton(onPressed: (){}, child: Text("Text1")),
    TextButton(onPressed: (){}, child: Text("Text2")),
  ],
);
複製程式碼

7、drawer

​ 左側抽屜選單元件,如果需要自定義可通過設定 Scaffoldkey 來操作手動開啟側邊欄,程式碼如下

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
  	title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
  	child: Text("body"),
  ),
	drawer: Drawer(
    child: Center(child: Text("draw"),),
  )
);
複製程式碼

8、onDrawerChanged

​ 左側抽屜選單改變事件回撥

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
  	title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
  	child: Text("body"),
  ),
	drawer: Drawer(
    child: Center(child: Text("draw"),),
  ),
  onDrawerChanged: (isOpen) {
  	print(isOpen);
  },
);
複製程式碼

9、endDrawer

​ 右側抽屜選單元件,功能和 drawer 一樣,唯一的區別是一個在左側,一個在右側。

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
  	title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
  	child: Text("body"),
  ),
	endDrawer: Drawer(
  	child: Center(child: Text("draw"),),
  ),
);
複製程式碼

10、onEndDrawerChanged

​ 右側抽屜選單改變事件回撥,使用方式和 onDrawerChanged 一樣。

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
  	title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
  	child: Text("body"),
  ),
	endDrawer: Drawer(
  	child: Center(child: Text("draw"),),
  ),
  onEndDrawerChanged: (isOpen) {
    print(isOpen);
  },
);
複製程式碼

11、bottomNavigationBar

​ 底部導航條,常用於切換底部 item

使用方法

  int _currentIndex = 0;
  List<Widget> _pages = [
    Center(child: Text("tab1"),),
    Center(child: Text("tab2"),),
  ];

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
  bottomNavigationBar: BottomNavigationBar(
    items: [
      BottomNavigationBarItem(
        label: "tab1",
        icon: Icon(Icons.settings)
      ),
      BottomNavigationBarItem(
        label: "tab2",
        icon: Icon(Icons.settings)
      )
    ],
    currentIndex: _currentIndex,
    onTap: (currentIndex) {
      setState(() {
        _currentIndex = currentIndex;
      });
    },
  ),
);
複製程式碼

12、bottomSheet

​ 持久在body下方,底部控制元件上方的控制元件

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
	bottomSheet: Container(child: Row(
    children: [
      Expanded(child: TextField()),
      ElevatedButton(onPressed: (){}, child: Text("傳送"))
    ],
  ),)
);
複製程式碼

13、backgroundColor

​ 腳手架背景顏色

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
	backgroundColor: Colors.pink,
);
複製程式碼

14、resizeToAvoidBottomInset

​ 防止元件重複,當鍵盤彈起時會擋住元件,該值設定為 ture 可防止鍵盤遮擋

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
	resizeToAvoidBottomInset: true,
);
複製程式碼

15、primary

​ 腳手架是否延伸到頂部

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
	primary: true,
);
複製程式碼

16、drawerDragStartBehavior

​ 拖動行為方式,與 drawer 配合使用,用於開啟和關閉抽屜的拖動行為將在檢測到拖動手勢時開始。 如果設定為 DragStartBehavior.down,它將在首次檢測到 down 事件時開始。當拖動返回時會使用 DragStartBehavior.down 是有很明顯的卡頓,建議使用 DragStartBehavior.start

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
  	title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
  	child: Text("body"),
  ),
	drawer: Drawer(
    child: Center(child: Text("draw"),),
  ),
  drawerDragStartBehavior: DragStartBehavior.start
);
複製程式碼

17、extendBody

​ 是否延伸到底部,主要用於做半透明效果。

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
	extendBody: true,
);
複製程式碼

18、extendBodyBehindAppBar

​ 是否延伸到頂部,用於做半透明、毛玻璃效果的主要控制屬性

使用方法

Scaffold(
  appBar: AppBar(
    title: Text("Scaffold"),
  ),
  body: _pages[_currentIndex],
	extendBodyBehindAppBar: true,
);
複製程式碼

19、drawerScrimColor

​ 側邊欄彈出時非遮蓋層主頁面的顏色

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
  	title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
  	child: Text("body"),
  ),
	drawer: Drawer(
    child: Center(child: Text("draw"),),
  ),
  drawerScrimColor: Colors.green,
);
複製程式碼

20、drawerEdgeDragWidth

​ 側邊欄彈出時非遮罩層的寬度,當滑動的距離小於該值時,遮罩層會彈出。預設值是20

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
    title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
    child: Text("body"),
  ),
  drawer: Drawer(
    child: Center(child: Text("draw"),),
  ),
  drawerScrimColor: Colors.green,
  drawerEdgeDragWidth: 100,
);
複製程式碼

21、drawerEnableOpenDragGesture

​ 左側抽屜是否支援手勢滑動,如果設定為 false ,將不能通過側滑手勢滑出,預設true

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
    title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
    child: Text("body"),
  ),
  drawer: Drawer(
    child: Center(child: Text("draw"),),
  ),
  drawerScrimColor: Colors.green,
  drawerEnableOpenDragGesture: false,
);
複製程式碼

22、endDrawerEnableOpenDragGesture

​ 右側抽屜是否支援手勢滑動,如果設定為 false ,將不能通過側滑手勢滑出,預設 true

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
    title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
    child: Text("body"),
  ),
  drawer: Drawer(
    child: Center(child: Text("draw"),),
  ),
  drawerScrimColor: Colors.green,
  drawerEnableOpenDragGesture: false,
  endDrawerEnableOpenDragGesture: false,
);
複製程式碼

23、restorationId

​ 狀態還原識別符號

使用方法

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

Scaffold(
  key: _scaffoldKey,
  appBar: AppBar(
    title: Text("Scaffold"),
    leading: IconButton(onPressed: (){
      _scaffoldKey.currentState.openDrawer();
    }, icon: Icon(Icons.menu_open)),
  ),
  body: Center(
    child: Text("body"),
  ),
	restorationId: "scaffold"
);
複製程式碼

總結

​ 以上是針對Scaffold的所有使用方法,最常用的屬性有appBarbody,其他屬性都是在特定的情況才會使用。

相關文章