Scaffold介绍
Scaffold
咱们通常俗称为脚手架,在后面的文章中咱们说到,Material
组件(MDC)帮忙开发者实现 Material Design,Scaffold
实现了根本的 Material Design 布局构造。在 Material
设计中定义的单个界面上的各种布局元素,在 Scaffold 中都反对。
Scaffold在什么状况下应用
在每一个页面中根本都须要用到Scaffold
,除非当你的页面不须要导航区,但仍心愿您应用 Scaffold
来作为每个页面的顶级组件。
示例代码
本文中很多成果都没有截图,可下载源代码运行我的项目 源代码地址,或者通过视频教程查看 视频教程地址
Scaffold属性和阐明
总共23个属性
字段 | 属性 | 形容 |
---|---|---|
appBar | PreferredSizeWidget | 显示脚手架的顶部导航区 |
body | Widget | 显示脚手架的次要内容 |
floatingActionButton | Widget | 悬浮按钮,位于右下角 |
floatingActionButtonLocation | FloatingActionButtonLocation | 决定悬浮按钮的地位 |
floatingActionButtonAnimator | FloatingActionButtonAnimator | 决定悬浮按钮的动画 |
persistentFooterButtons | List<Widget> | 显示在脚手架底部的一组按钮 |
drawer | Widget | 左侧抽屉菜单组件 |
onDrawerChanged | DrawerCallback | 左侧抽屉菜单扭转事件回调 |
endDrawer | Widget | 右侧抽屉菜单组件 |
onEndDrawerChanged | DrawerCallback | 右侧抽屉菜单扭转事件回调 |
bottomNavigationBar | Widget | 底部导航条 |
bottomSheet | Widget | 长久在body下方,底部控件上方的控件 |
backgroundColor | Color | 脚手架背景色彩 |
resizeToAvoidBottomInset | bool | 避免小组件反复 |
primary | bool | 脚手架是否延长到顶部 |
drawerDragStartBehavior | DragStartBehavior | 检测手势行为形式,与drawer配合应用 |
extendBody | bool | 是否延长到底部 |
extendBodyBehindAppBar | bool | 是否延长到顶部,用于做半透明、毛玻璃成果的次要管制属性 |
drawerScrimColor | Color | 侧边栏弹出时非遮蔽层主页面的色彩 |
drawerEdgeDragWidth | double | 侧边栏弹出时非遮罩层的宽度 |
drawerEnableOpenDragGesture | bool | 左侧抽屉是否反对手势滑动 |
endDrawerEnableOpenDragGesture | bool | 右侧抽屉是否反对手势滑动 |
restorationId | String | 状态还原标识符 |
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
左侧抽屉菜单组件,如果须要自定义可通过设置 Scaffold
的 key
来操作手动关上侧边栏,代码如下
应用办法
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的所有应用办法,最罕用的属性有appBar
、body
,其余属性都是在特定的状况才会应用。
发表回复