常用组件--Drawer

作者: Henry________ | 来源:发表于2019-05-16 18:40 被阅读11次
  • 先看看如何使用,使用drawer也很简单.
Scaffold(
    drawer: myDrawer(),
    appBar: AppBar(
      title: Text('Home'),
    ),
    body: Center(
      child: Container(
        child: Text('hello world'),),)
  • 查看Scaffold的build方法中drawer的初始化方法,可以看到系统是如何创建和使用drawer;
  • DrawerController这个组件是控制drawer的出现和消失,但是系统并没有开放打开和关闭的销毁回调方法。如果想要使用该回调则需要自定义drawer。
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来展开。
const Drawer({
    Key key,
    this.elevation = 16.0,
    this.child,
    this.semanticLabel,
  }) : assert(elevation != null && elevation >= 0.0),
       super(key: key);
  • child中一般使用ListView来当做容器、也可以使用Column都是可以的
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导致的。
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地址

相关文章

  • 常用组件--Drawer

    先看看如何使用,使用drawer也很简单. 查看Scaffold的build方法中drawer的初始化方法,可以看...

  • Flutter 18 - Drawer 组件详解

    一、Drawer 组件 在 Scaffold 组件里面传入 drawer 参数可以定义左侧边栏,传入 endDra...

  • 如何为第三方vue组件进行自定义/拓展属性方法

    最近有个需求,项目用的IVIEW4 UI.问题:drawer组件在选中文本移动到蒙层松开会是drawer关闭(组件...

  • Flutter Drawer(抽屉菜单)

    Drawer(抽屉菜单)即通过右侧/左侧滑出来的菜单栏。在 Flutter 里使用的是 Drawer 组件。 使用...

  • element ui的坑

    1.修改样式无效 drawer组件 有自带黑框 解决: /*去掉自带的黑框*/ .el-drawer:focus{...

  • Fluter:抽屉效果

    效果图 flutter的抽屉效果是使用Drawer组件实现的 Drawer可以添加头部属性: tabbar底部导航...

  • Flutter 控件-Drawer使用

    Drawer Drawer是Android开发中Material风格常用的设计,就是我们常说的“抽屉”效果,一个从...

  • Flutter 抽屉菜单-Drawer使用

    Drawer Drawer是Android开发中Material风格常用的设计,就是我们常说的“抽屉”效果,一个从...

  • app-drawer

    "app-drawer"是一个由polymer编写的抽屉组件,demo可看这里。 "app-drawer"由官方p...

  • Flutter之Drawer组件

    UserAccountsDrawerHeaderUserAccountsDrawerHeader 可以设置用户头像...

网友评论

    本文标题:常用组件--Drawer

    本文链接:https://www.haomeiwen.com/subject/carwaqtx.html