Flutter 04:Drawer抽屉组件

2,392 阅读1分钟

基本概念

Drawer({
    Key key,
    double elevation: 16.0, 
    Widget child, 
    String semanticLabel
})

作用:Drawer(抽屉组件)可以实现类似抽屉拉出和推入的效果,可以从侧边栏拉出导航面板。通常Drawer是和ListView组件组合使用的。

Drawer组件可以添加头部效果,用DrawerHeader(展示基本信息)和UserAccountsDrawerHeader(展示用户头像、用户名、Email等信息)这两个组件可以实现。

关于DrawerHeader和UserAccountsDrawerHeader

DrawerHeader({
    Key key, 
    Decoration decoration, //动画持续时间
    EdgeInsetsGeometry margin: const EdgeInsets.only(bottom: 8.0), EdgeInsetsGeometry padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 8.0), 
    Duration duration: const Duration(milliseconds: 250), 
    Curve curve: Curves.fastOutSlowIn, //动画慢进进快出
    @required Widget child
})
UserAccountsDrawerHeader({
    Key key, 
    Decoration decoration, 
    EdgeInsetsGeometry margin: const EdgeInsets.only(bottom: 8.0), Widget currentAccountPicture, //用户头像
    List<Widget> otherAccountsPictures, //其他头像
    @required Widget accountName, //名称
    @required Widget accountEmail, //邮箱
    VoidCallback onDetailsPressed, //查看详情的回调
    Color arrowColor: Colors.white
})

实例

 Scaffold(
    appBar: AppBar(
        leading: Builder( //自定义抽屉图标
          builder: (BuildContext context){
            return InkWell(
                child: Container(
                    padding: EdgeInsets.all(15),
                    child: ClipOval(
                      child: Image.asset(
                        'lib/assets/images/avatar.png',
                      ),
                    )
                  ),
                onTap: (){//打开抽屉
                    Scaffold.of(context).openDrawer();
                },
            );
          }
        ),
        title: Text('测试抽屉组件'),
        centerTitle: true,
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.search), 
            onPressed: (){}
          )
        ],
    ),
    drawer: Drawer(
      child: ListView(
        padding: EdgeInsets.zero, //注意设置0
        children: <Widget>[
          UserAccountsDrawerHeader(
            currentAccountPicture: GestureDetector(
                child: ClipOval(
                  child: Image.asset('lib/assets/images/avatar.png'),
                ),
            ),
            otherAccountsPictures: <Widget>[
                IconButton(
                  icon: Icon(Icons.stars, color: Colors.white),
                  onPressed: (){}
                )
            ],
            accountName: Text(
                '我是小鱼', 
                style: TextStyle(fontWeight: FontWeight.bold, fontSize: 40),
            ), 
            accountEmail: Text(YStrings.github),
            onDetailsPressed: (){},
          ),
          ListTile(
            leading: Icon(Icons.color_lens),
            title: Text('测试1'),
            trailing: Icon(Icons.chevron_right),
            onTap: (){},
          ),
          ListTile(
            leading: Icon(Icons.share),
            title: Text('测试2'),
            trailing: Icon(Icons.chevron_right),
            onTap: (){},
          ),
          ListTile(
            leading: Icon(Icons.info_outline),
            title: Text('测试3'),
            trailing: Icon(Icons.chevron_right),
            onTap: (){},
          ),
        ],
      ),
    )
 )

注意:添加Drawer组件,Scaffold会自动给我们生成一个Drawer的按钮,如果我们在appBar中手动设置leading,确实是会更改这个按钮的图标,但是点击这个图标就不会弹出Drawer了,所以如果我们有需要自定义Drawer的图标

效果图