Flutter Drawer侧边栏、以及侧边栏内容布局
1.FlutterDrawer 侧边栏
在 Scaffold 组件里面传入 drawer 参数可以定义左侧边栏,传入 endDrawer 可以定义右侧边 栏。侧边栏默认是隐藏的,我们可以通过手指滑动显示侧边栏,也可以通过点击按钮显示侧 边栏。
属性
说明
Drawer :
elevation 背景高度
child 子组件
semanticLabel 标签
UserAccountsDrawerHeader:
decoration 头部装饰
margin 外边距 默认8.0
currentAccountPicture 主图像
otherAccountsPictures 附图像
accountName 标题
accountEmail 副标题
onDetailsPressed 点击监听
drawerHeader属性
const DrawerHeader({
Key key,
this.decoration,
this.margin = const EdgeInsets.only(bottom: 8.0),
this.padding = const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 8.0),
this.duration = const Duration(milliseconds: 250),
this.curve = Curves.fastOutSlowIn,
@required this.child,
}) : super(key: key);
2代码演示
import 'package:flutter/material.dart';
import 'tabs/Home.dart';
import 'tabs/Category.dart';
import 'tabs/Setting.dart';
class Tabs extends StatefulWidget {
final index;
Tabs({Key key, this.index = 0}) : super(key: key);
_TabsState createState() => _TabsState(this.index);
}
class _TabsState extends State<Tabs> {
int _currentIndex;
_TabsState(index) {
this._currentIndex = index;
}
List _pageList = [
HomePage(),
HomePage(),
HomePage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter App"),
),
body: this._pageList[this._currentIndex],
bottomNavigationBar: BottomNavigationBar(
currentIndex: this._currentIndex,
//配置对应的索引值选中
onTap: (int index) {
setState(() {
//改变状态
this._currentIndex = index;
});
},
iconSize: 36.0,
//icon的大小
fixedColor: Colors.red,
//选中的颜色
type: BottomNavigationBarType.fixed,
//配置底部tabs可以有多个按钮
items: [
BottomNavigationBarItem(icon: Icon(Icons.home), title: Text("首页")),
BottomNavigationBarItem(
icon: Icon(Icons.category), title: Text("分类")),
BottomNavigationBarItem(icon: Icon(Icons.settings), title: Text("设置"))
],
),
drawer: Drawer(
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: DrawerHeader(
child: Text("你好flutter"),
// child: Icon(Icons.settings),
decoration: BoxDecoration(
color: Colors.yellow,
image: DecorationImage(
image: NetworkImage(
"https://www.itying.com/images/flutter/2.png"),
fit: BoxFit.cover,
))
)
),
Expanded(
flex: 1,
child: IconContainer(Icons.home,color: Colors.orange),
),
],
),
ListTile(
leading: CircleAvatar(child: Icon(Icons.home)),
title: Text("我的空间"),
),
Divider(),
ListTile(
leading: CircleAvatar(child: Icon(Icons.people)),
title: Text("用户中心"),
),
Divider(),
ListTile(
leading: CircleAvatar(child: Icon(Icons.settings)),
title: Text("设置中心"),
),
Divider(),
],
),
),
endDrawer: Drawer(
child: Text('右侧侧边栏'),
),
);
}
}
class IconContainer extends StatelessWidget{
double size=32.0;
Color color=Colors.red;
IconData icon;
IconContainer(this.icon,{this.color,this.size});
@override
Widget build(BuildContext context) {
// TODO: implement build
return Container(
height: 100.0,
width: 100.0,
color: this.color,
child: Center(
child: Icon(this.icon,size: this.size,color: Colors.white)
),
);
}
}
3.UserAccountsDrawerHeader
——————在Flutter中头像的一种方式,使用CircleAvatar
——————固定写法,不能自定义,如果需要自定义,需要使用DrawerHeader来实现
UserAccountsDrawerHeader:
decoration 头部装饰
margin 外边距 默认8.0
currentAccountPicture 主图像
otherAccountsPictures 附图像
accountName 标题
accountEmail 副标题
onDetailsPressed 点击监听
import 'package:flutter/material.dart';
import 'tabs/Home.dart';
import 'tabs/Category.dart';
import 'tabs/Setting.dart';
class Tabs extends StatefulWidget {
final index;
Tabs({Key key,this.index=0}) : super(key: key);
_TabsState createState() => _TabsState(this.index);
}
class _TabsState extends State<Tabs> {
int _currentIndex;
_TabsState(index){
this._currentIndex=index;
}
List _pageList=[
HomePage(),
CategoryPage(),
SettingPage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter App"),
),
body: this._pageList[this._currentIndex],
bottomNavigationBar: BottomNavigationBar(
currentIndex: this._currentIndex, //配置对应的索引值选中
onTap: (int index){
setState(() { //改变状态
this._currentIndex=index;
});
},
iconSize:36.0, //icon的大小
fixedColor:Colors.red, //选中的颜色
type:BottomNavigationBarType.fixed, //配置底部tabs可以有多个按钮
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text("首页")
),
BottomNavigationBarItem(
icon: Icon(Icons.category),
title: Text("分类")
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
title: Text("设置")
)
],
),
drawer: Drawer(
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: UserAccountsDrawerHeader(
accountName:Text("hello world"),
accountEmail: Text("兴趣爱好点"),
currentAccountPicture: CircleAvatar(
backgroundImage: NetworkImage("https://www.itying.com/images/flutter/3.png"),
),
decoration:BoxDecoration(
image: DecorationImage(
image: NetworkImage("https://www.itying.com/images/flutter/4.png"),
fit:BoxFit.cover,
)
),
otherAccountsPictures: <Widget>[
Image.network("https://www.itying.com/images/flutter/2.png"),
Image.network("https://www.itying.com/images/flutter/5.png"),
],
)
)
],
),
ListTile(
leading: CircleAvatar(
child: Icon(Icons.home)
),
title: Text("我的空间"),
),
Divider(),
ListTile(
leading: CircleAvatar(
child: Icon(Icons.people)
),
title: Text("用户中心"),
onTap: (){
Navigator.of(context).pop(); //隐藏侧边栏
Navigator.pushNamed(context, '/user');
},
),
Divider(),
ListTile(
leading: CircleAvatar(
child: Icon(Icons.settings)
),
title: Text("设置中心"),
),
Divider(),
],
),
),
endDrawer: Drawer(
child: Text('右侧侧边栏'),
),
);
}
}
4. 自定义Header
Flutter有DrawerHeader,我们对其进行自定义。
- DrawerHeader设置padding为0,充满整个顶部
- DrawerHeader的child使用Stack,目的是放置背景图片
- 在Stack偏左下的位置放置头像和用户名
- 先用Align确定对齐方式为FractionalOffset.bottomLeft
- Align的child为Container,并设定一个具体高度
- 头像与文字的Container仿照ListTile的风格,左边是一个头像,右边是文字;使用Row来分-隔头像和文字
- 文字部分先用Container的margin做出间隔,再放入一个Column来存放Text
- 文字Column设置水平方向左对齐与竖直方向居中
Widget header = DrawerHeader(
padding: EdgeInsets.zero, /* padding置为0 */
child: new Stack(children: <Widget>[ /* 用stack来放背景图片 */
new Image.asset(
'images/p_h_r_600.png', fit: BoxFit.fill, width: double.infinity,),
new Align(/* 先放置对齐 */
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, // 水平方向左对齐
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),),
],
),
),
],),
),
),
]),);