前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用组件--Drawer常用组件--Drawer

常用组件--Drawer常用组件--Drawer

作者头像
用户8893176
发布2021-08-09 13:30:48
9310
发布2021-08-09 13:30:48
举报
文章被收录于专栏:小黑娃Henry
  • 先看看如何使用,使用drawer也很简单.
代码语言:javascript
复制
Scaffold(
    drawer: myDrawer(),
    appBar: AppBar(
      title: Text('Home'),
    ),
    body: Center(
      child: Container(
        child: Text('hello world'),),)
  • 查看Scaffold的build方法中drawer的初始化方法,可以看到系统是如何创建和使用drawer;
  • DrawerController这个组件是控制drawer的出现和消失,但是系统并没有开放打开和关闭的销毁回调方法。如果想要使用该回调则需要自定义drawer。
代码语言:javascript
复制
void _buildDrawer(List<LayoutId> children, TextDirection textDirection) {
    if (widget.drawer != null) {
      assert(hasDrawer);
      _addIfNonNull(
        children,
        DrawerController(
          key: _drawerKey,
          alignment: DrawerAlignment.start,
          child: widget.drawer,
          drawerCallback: _drawerOpenedCallback,
          dragStartBehavior: widget.drawerDragStartBehavior,
),);}}
  • 话不多说先看源码。初始化方法并无新意,使用它主要是围绕child来展开。
代码语言:javascript
复制
const Drawer({
    Key key,
    this.elevation = 16.0,
    this.child,
    this.semanticLabel,
  }) : assert(elevation != null && elevation >= 0.0),
       super(key: key);
  • child中一般使用ListView来当做容器、也可以使用Column都是可以的
代码语言:javascript
复制
Drawer(
 elevation: 20,
 child: ListView(   //或者是Column
 //此处设置padding可以避免顶部间隙
    padding: EdgeInsets.zero,
    children: <Widget>[
      DrawerHeader(//drawer头部展示用控件
        decoration: BoxDecoration(
          color: Colors.tealAccent,
        ),
        child: Center(
            MaterialButton(
              color: Colors.blueAccent,
              child: Text('logout'),
              onPressed: ()=>{
              //手动关闭侧边Drawer控件
                Navigator.pop(context)
              },
            )
       ),
       ListView(),
    ],
 )  
)
  • 根据发现drawer顶部的白色阴影非常的丑,根据测试找到了是在ListView中没有设置padding导致的。
代码语言:javascript
复制
List<Widget> buildSlivers(BuildContext context) {
    ...
    if (padding == null) {  //如果不设置padding系统则会自己根据手机方向来预设一个sliver,也就是这个sliver导致那个非常丑的间隙
      final MediaQueryData mediaQuery = MediaQuery.of(context, nullOk: true);
      if (mediaQuery != null) {
        final EdgeInsets mediaQueryHorizontalPadding =
            mediaQuery.padding.copyWith(top: 0.0, bottom: 0.0);
        final EdgeInsets mediaQueryVerticalPadding =
            mediaQuery.padding.copyWith(left: 0.0, right: 0.0);
        effectivePadding = scrollDirection == Axis.vertical
            ? mediaQueryVerticalPadding
            : mediaQueryHorizontalPadding;
        sliver = MediaQuery(
          data: mediaQuery.copyWith(
            padding: scrollDirection == Axis.vertical
                ? mediaQueryHorizontalPadding
                : mediaQueryVerticalPadding,
          ),
          child: sliver,
    );
  }
  ...
}

前后区别

截图_d44b7036-2e52-41f4-a663-7c72564f4f50.png

截图_761560bd-37b3-4440-b83b-197d518099c1.png

自定义Drawer可以去Git下载我的demo查看。 我的Git地址

传送门:

Flutter-汇总

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/5/16 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 传送门:
  • Flutter-汇总
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档