Flutter学习之Dawer抽屉组件与Floating Button集成

简介

  • Drawer 组件可以实现类似抽屉拉出推入的效果,一般是制作从侧边栏拉出导航面板。通常 Drawer 是和 ListView 组件组合使用的。
  • Floating Button 对应一个圆形图标按钮, 悬停在内容之上,以展示应用程序中的主要动作,所以非常醒目。

实现的效果

 

 详细说明

Drawer 组件可以添加头部效果,用以下两个组件可以实现:

  • Drawer Header : 展示基本信息。
DrawerHeader 组件属性说明
属性名类型说明
decorationDecorationheader 区域的 decoration ,通常用来设置背景颜色或者背景图片
curveCurve

如果 decoration 发生了变化,则会使用curve 设置的变化曲线和 duration 设置的动因时间来做一个切换动画

childWidgetHeader 里面所显示的内容控件
paddingEdgeInsetsGeometryHeader 里面内容控件的 padding 值,如果 child 为 null,则这个值无效
marginEdgeInsetsGeometryHeader 四周的间隙
  • UserAccountsD rawerHeader : 展示用户头像、用户名、Email 等信息。
UserAccountsDrawerHeader 详细说明
属性名类型说明
marginEdgeInsetsGeometryHeader 四周的间隙
decorationDecorationheader 区域的 decoration ,通常用来设置背景颜色或者背景图片
currentAccountPictureWidget用来设置当前用户的头像
otherAccountsPicturesList<Widget>用来设置当前用户其他账号的头像
accountNameWidget当前用户的名字
accountEmailWidget当前用户的Email
onDetailsPressedVoidCalIback当accountN ame 或者acco untEmail 被点击的时候所触发的回调函数,可以用来显示其他额外的信息

具体实现

我们将需要展示出来的两个组件 floatingButton 与 drawer 组件单独出来,然后放置到需要展示的组件上面(当前的APP),这样子避免所有的代码写在一起,方便于维护与阅读。

创建一个 FloatingButton 组件

// 将浮动按钮抽取为单独的一个 widget 
class FloatingButton extends StatelessWidget {
  @override
   Widget build(BuildContext context) {
     return new Builder(builder: (BuildContext context){
        return new FloatingActionButton(
          child: const Icon(Icons.add),
          // 提示信息
          tooltip: "请点击 FloatingActionButton",
          foregroundColor: Colors.white,    // 前景色
          backgroundColor: Colors.blue,     // 背景色
          elevation: 10.0,                  // 未点击阴影值
          highlightElevation: 10.0,         // 点击阴影值
          onPressed: (){
            Scaffold.of(context).showSnackBar(new SnackBar(content: new Text('瞎点击')));
            
          },
          mini: false,                      // 如果设置为true 图标显示会特别小
          shape: new CircleBorder(),        // 圆形边
          isExtended: true,
        );
      },); 
   }
}

创建一个 DrawerWidget 组件

// 将 drawer 抽屉组件抽取为一个单独的 widget
class DrawerWidget extends StatelessWidget{

  final String imageUrl;
  // 图片展示的地址从外面传入
  const DrawerWidget(this.imageUrl);

  @override
  Widget build(BuildContext context){
    return new Drawer(
        child: ListView(
          children: <Widget>[
            // 设置用户信息 头像、用户名、Email 等
            UserAccountsDrawerHeader(
              accountName: new Text('Wayfreem'),
              accountEmail: new Text('wayfreem@163.com'),
              // 设置当前的头像
              currentAccountPicture: new CircleAvatar( backgroundImage: new NetworkImage(imageUrl),),
              onDetailsPressed: (){ print('瞎JB点击'); },

              // 属性本来是用来设置当前用户的其他账号的头像,这里用来当 QQ 二维码图片展示
              otherAccountsPictures: <Widget>[new Container( child: Image.network(imageUrl),)],
            ),
            new ListTile(
              leading: new CircleAvatar(child: Icon(Icons.color_lens),),
              title: Text("个性装扮"),
            ),
            new ListTile(
              leading: new CircleAvatar(child: Icon(Icons.photo),),
              title: Text("我的相册"),
            ),
            new ListTile(
              leading: new CircleAvatar(child: Icon(Icons.wifi),),
              title: Text("免流量特权"),
            ),
            
          ],  
        ),
      );
  }
}

最后拼接到一起

void main() => runApp(new MaterialApp(
  title: 'Drawer 抽屉组件',
  home: new LayoutDemo(),
));

class LayoutDemo extends StatelessWidget{

  String imageUrl = 'https://b-ssl.duitang.com/uploads/item/' +
        '201602/15/20160215235057_EU3tS.thumb.700_0.jpeg';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text('Drawer 抽屉组件'),),
      drawer: new DrawerWidget(imageUrl),
      // 主体区域放置一个文本显示
      body: Center(
        child: Text('floating button', style: new TextStyle(fontSize: 28),),
      ),

      // 放置一个浮动的按钮
      floatingActionButton: FloatingButton(),
      // 浮动按钮的放置位置
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,

    );
  }
}

附完整的代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() => runApp(new MaterialApp(
  title: 'Drawer 抽屉组件',
  home: new LayoutDemo(),
));

class LayoutDemo extends StatelessWidget{

  String imageUrl = 'https://b-ssl.duitang.com/uploads/item/' +
        '201602/15/20160215235057_EU3tS.thumb.700_0.jpeg';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text('Drawer 抽屉组件'),),
      drawer: new DrawerWidget(imageUrl),
      // 主体区域放置一个文本显示
      body: Center(
        child: Text('floating button', style: new TextStyle(fontSize: 28),),
      ),

      // 放置一个浮动的按钮
      floatingActionButton: FloatingButton(),
      // 浮动按钮的放置位置
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,

    );
  }
}

// 将 drawer 抽屉组件抽取为一个单独的 widget
class DrawerWidget extends StatelessWidget{

  final String imageUrl;

  const DrawerWidget(this.imageUrl);

  @override
  Widget build(BuildContext context){
    return new Drawer(
        child: ListView(
          children: <Widget>[
            // 设置用户信息 头像、用户名、Email 等
            UserAccountsDrawerHeader(
              accountName: new Text('Wayfreem'),
              accountEmail: new Text('wayfreem@163.com'),
              // 设置当前的头像
              currentAccountPicture: new CircleAvatar( backgroundImage: new NetworkImage(imageUrl),),
              onDetailsPressed: (){ print('瞎JB点击'); },

              // 属性本来是用来设置当前用户的其他账号的头像,这里用来当 QQ 二维码图片展示
              otherAccountsPictures: <Widget>[new Container( child: Image.network(imageUrl),)],
            ),
            new ListTile(
              leading: new CircleAvatar(child: Icon(Icons.color_lens),),
              title: Text("个性装扮"),
            ),
            new ListTile(
              leading: new CircleAvatar(child: Icon(Icons.photo),),
              title: Text("我的相册"),
            ),
            new ListTile(
              leading: new CircleAvatar(child: Icon(Icons.wifi),),
              title: Text("免流量特权"),
            ),
            
          ],  
        ),
      );
  }
}

// 将浮动按钮抽取为单独的一个 widget 
class FloatingButton extends StatelessWidget {
  @override
   Widget build(BuildContext context) {
     return new Builder(builder: (BuildContext context){
        return new FloatingActionButton(
          child: const Icon(Icons.add),
          // 提示信息
          tooltip: "请点击 FloatingActionButton",
          foregroundColor: Colors.white,    // 前景色
          backgroundColor: Colors.blue,     // 背景色
          elevation: 10.0,                  // 未点击阴影值
          highlightElevation: 10.0,         // 点击阴影值
          onPressed: (){
            Scaffold.of(context).showSnackBar(new SnackBar(content: new Text('瞎点击')));
            
          },
          mini: false,                      // 如果设置为true 图标显示会特别小
          shape: new CircleBorder(),        // 圆形边
          isExtended: true,
        );
      },); 
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayfreem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值