zoukankan      html  css  js  c++  java
  • Drawer实现侧边栏布局

    在 Scaffold 组件里面传入 drawer 参数可以定义左侧边栏,传入 endDrawer 可以定义右侧边栏。侧边栏默认是隐藏的,我们可以通过手指滑动显示侧边栏,也可以通过点击按钮显示侧边栏。 
    我们还是在前面TabBar项目的基础上实现侧边栏。
    为了能在底部TabBar的三个页面都实现侧边栏效果,这里将侧边栏加在Tabs.dart页面中。
    只需要在
    BottomNavigationBar下面继续添加drawer属性就可以了。
    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=0;
       int _currentIndex;
      _TabsState(index){
        this._currentIndex=index;
      }
      List _pageList=[
        HomePage(),
        CategoryPage(),
        SettingPage(),
      ];
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text("Flutter Demo"),
            ),
            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:Text('这里是测边栏')
            ),
          );
      }
    }

    此时在顶部会出现一个可点击的图标按钮,不管是点击这个按钮还是滑动屏幕,都会出现侧边栏:

       

     如果要实现右边的侧边栏,只需要使用endDrawer就可以了:

    上面的样式太丑了,所以,可以稍微调整一下了:

        

    现在,虽然侧边栏里面多了一下内容,但是顶部还是出现了遮盖的现象,因此,可以借助DrawerHeader 组件来设置一下侧边栏顶部的样式。

    DrawerHeader 

     在flutter中,DrawerHeader 有以下一些常用的属性:

    • decoration :设置顶部背景颜色 
    • child :配置子元素 
    • padding :内边距 
    • margin :外边距 

       

    现在,借助了DrawerHeader实现了侧边栏的头部样式,除此之外,还可以借助UserAccountsDrawerHeader实现侧边栏头部的布局。

    UserAccountsDrawerHeader

     在flutter中,UserAccountsDrawerHeader有以下一些常用的属性:

    • decoration :设置顶部背景颜色 
    • accountName:账户名称 
    • accountEmail :账户邮箱 
    • currentAccountPicture :用户头像 
    • otherAccountsPictures :用来设置当前账户其他账户头像 
    • margin :

        

    侧边栏中的路由跳转

    要实现路由跳转,首先需要有供跳转的页面:

    User.dart

    import 'package:flutter/material.dart';
    
    class UserPage extends StatelessWidget {
      const UserPage({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("用户中心"),
          ),
        );
      }
    }

    然后配置路由:

     最后,在用户中心处添加路由跳转按钮就可以了。但是有一个问题:在侧边栏进行路由跳转,那么侧边栏是开启的,这样,页面跳转后再返回,侧边栏还是存在的,并且动画上面还会出现不流畅性,因此,在路由跳转前,需要先隐藏侧边栏:

        

    Tabs.dart

    import 'package:flutter/material.dart';
    import 'tabs/Home.dart';
    import 'tabs/Category.dart';
    import 'tabs/Setting.dart';
    
    class Tabs extends StatefulWidget {
      // Tabs({Key key}) : super(key: key);
      // _TabsState createState() => _TabsState();
       final index;
      Tabs({Key key,this.index=0}) : super(key: key);
    
      _TabsState createState() => _TabsState(this.index);
    }
    
    class _TabsState extends State<Tabs> {
    
      // int _currentIndex=0;
       int _currentIndex;
      _TabsState(index){
        this._currentIndex=index;
      }
      List _pageList=[
        HomePage(),
        CategoryPage(),
        SettingPage(),
      ];
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text("Flutter Demo"),
            ),
            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('你好'),
                        //   decoration: BoxDecoration(
                        //     color:Colors.yellow,
                        //     image: DecorationImage(
                        //       image: NetworkImage("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3230740943,2194698121&fm=27&gp=0.jpg"),
                        //       fit:BoxFit.cover,
                        //     ),
                        //   ),
                        // ),
                        child:UserAccountsDrawerHeader(
                          currentAccountPicture: CircleAvatar(
                            backgroundImage: NetworkImage("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1547205045,3791549413&fm=27&gp=0.jpg"),
                          ),
                          accountName: Text('侧边栏'),
                          accountEmail: Text('12345678@qq.com'),
                          decoration: BoxDecoration(
                            image: DecorationImage(
                              image: NetworkImage("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3230740943,2194698121&fm=27&gp=0.jpg"),
                              fit:BoxFit.cover,
                            )
                          ),
                        ),
                      ),
                    ],
                  ),
                  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('设置中心')
                  ),
                ],
              )
            ),
          );
      }
    }

     代码下载:点这里(提取码:ukur)

  • 相关阅读:
    C# 数据操作系列
    C# 数据操作系列
    C# 基础知识系列- 17 小工具优化
    C# 基础知识系列- 17 实战篇 编写一个小工具(1)
    计算机网络知识概述
    微信公众号开发:消息处理
    微信公众号开发:服务器配置
    C#调用接口注意要点
    npm安装和Vue运行
    实战spring自定义属性(schema)
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/11027027.html
Copyright © 2011-2022 走看看