Flutter 之 SnackBar (九十六)

2022-06-07  本文已影响0人  maskerII

SnackBar 是一个常见的底部消息弹框

1. SnackBar

  const SnackBar({
    Key? key,
    required this.content,
    this.backgroundColor,
    this.elevation,
    this.margin,
    this.padding,
    this.width,
    this.shape,
    this.behavior,
    this.action,
    this.duration = _snackBarDisplayDuration,
    this.animation,
    this.onVisible,
    this.dismissDirection = DismissDirection.down,
  })

SnackBar属性

SnackBar属性 介绍
content @required 左侧内容 Widget
backgroundColor 背景色
elevation 阴影高度
padding 内边距
margin 外边距 不能和width 一起设置,behavior 设置为SnackBarBehavior.fixed时,不能设置margin
width SnackBar 宽度 不能和margin 一起设置,behavior 设置为SnackBarBehavior.fixed时,不能设置width
shape 形状 ShapeBorder
behavior SnackBarBehavior.fixed 是贴合屏幕边框的,SnackBarBehavior.floating 是悬浮出来的一个弹框
action SnackBarAction,右侧事件按钮
duration 弹框展示时长,默认为 Duration(milliseconds: 4000)
animation 动画效果,没啥太大用,使用 showSnackBar,会被自带动画替换
onVisible SnackBar 展示在屏幕上时的回调函数
dismissDirection SnackBar 消失方向 默认 DismissDirection.down

2. SnackBarAction

  const SnackBarAction({
    Key? key,
    this.textColor,
    this.disabledTextColor,
    required this.label,
    required this.onPressed,
  })

SnackBarAction属性

SnackBarAction属性 介绍
textColor 字体颜色
disabledTextColor 不可用时字体颜色
label 事件文字
onPressed @required 点击事件

3. 实例

示例1


  SnackBar _baseSnackBar1() {
    return SnackBar(
      content: Text("SnackBar 是一个常见的底部消息弹框。"), // 左侧内容 Widget
      backgroundColor: Colors.cyan[200], // 背景色
      elevation: 10, // 阴影高度
      shape:
          RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), // 形状
      padding: EdgeInsets.all(8), // 内边距
      // margin: EdgeInsets.all(8), // 外边距 不能和width 一起设置,behavior 设置为SnackBarBehavior.fixed时,不能设置margin
      // width: 300, //SnackBar 宽度 不能和margin 一起设置,behavior 设置为SnackBarBehavior.fixed时,不能设置width
      behavior: SnackBarBehavior
          .fixed, // SnackBarBehavior.fixed 是贴合屏幕边框的,SnackBarBehavior.floating 是悬浮出来的一个弹框
      // SnackBarAction,右侧事件按钮
      action: SnackBarAction(
        textColor: Colors.blue[400],
        disabledTextColor: Colors.grey[400],
        onPressed: () {},
        label: "关闭",
      ),
      duration: Duration(milliseconds: 4000), // 弹框展示时长
      // SnackBar 展示在屏幕上时的回调函数
      onVisible: () {},
      dismissDirection: DismissDirection.down, // 消失方向 默认 DismissDirection.down
    );
  }

image.png

示例2


  SnackBar _baseSnackBar2() {
    return SnackBar(
      content: Text(
          "Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。 [5]  Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。Flutter已推出稳定的2.0版本。"),
      backgroundColor: Colors.amber,
      behavior: SnackBarBehavior.floating,
      margin: EdgeInsets.all(12),
      padding: EdgeInsets.all(8),
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
      duration: Duration(milliseconds: 5000),
      onVisible: () {
        print("onVisible");
      },
      dismissDirection: DismissDirection.up,
      elevation: 10.0,
      action: SnackBarAction(
        label: "OK",
        onPressed: () {
          print("SnackBarAction Clicked");
        },
        textColor: Colors.red[200],
      ),
    );
  }

image.png

示例3


  SnackBar _customContentSnackBar() {
    return SnackBar(
      content: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          CircleAvatar(
            backgroundImage: AssetImage("assets/images/4.jpeg"),
            radius: 40,
          ),
          SizedBox(width: 8),
          Expanded(
            child: Text(
                "Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。 [5]  Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。Flutter已推出稳定的2.0版本。"),
          ),
        ],
      ),
      behavior: SnackBarBehavior.floating,
      margin: EdgeInsets.all(12),
      padding: EdgeInsets.all(8),
      action: SnackBarAction(
        label: "OK",
        onPressed: () {},
        textColor: Colors.red,
      ),
      backgroundColor: Colors.cyan[200],
      elevation: 8,
    );
  }


image.png

4. SnackBar 进阶

在SnackBar的使用过程中, 我们会发现一个问题,当我们连续点击不同弹框时,并不会立即弹出下一个,而是按照 duration 展示每一个 SnackBar,如果大量调用,就会一直在最下方等待弹出,这是肯定没法接受的。因而,我们需要取消上一个弹框

取消弹框有以下三种方式

ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).hideCurrentSnackBar();

所以建议这么使用,showSnackBar 之前,先隐藏当前 SnackBar。

  ScaffoldMessenger.of(context).clearSnackBars();
  ScaffoldMessenger.of(context)
      .showSnackBar(_baseSnackBar1());

5. Demo


class MSSnackBarRoute extends StatelessWidget {
  const MSSnackBarRoute({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("MSSnackBarRoute")),
      body: SingleChildScrollView(
        child: Center(
          child: Builder(builder: (context) {
            return Column(
              children: [
                ElevatedButton(
                  onPressed: () {
                    // ScaffoldMessenger.of(context).clearSnackBars();
                    // ScaffoldMessenger.of(context).removeCurrentSnackBar();
                    // ScaffoldMessenger.of(context).hideCurrentSnackBar();

                    ScaffoldMessenger.of(context).clearSnackBars();
                    ScaffoldMessenger.of(context)
                        .showSnackBar(_baseSnackBar1());
                  },
                  child: Text("SnackBar 1"),
                ),
                ElevatedButton(
                  onPressed: () {
                    ScaffoldMessenger.of(context).clearSnackBars();
                    ScaffoldMessenger.of(context)
                        .showSnackBar(_baseSnackBar2());
                  },
                  child: Text("SnackBar 2"),
                ),
                ElevatedButton(
                  onPressed: () {
                    ScaffoldMessenger.of(context).clearSnackBars();
                    ScaffoldMessenger.of(context)
                        .showSnackBar(_customContentSnackBar());
                  },
                  child: Text("SnackBar 3"),
                ),
              ],
            );
          }),
        ),
      ),
    );
  }

  SnackBar _baseSnackBar1() {
    return SnackBar(
      content: Text("SnackBar 是一个常见的底部消息弹框。"), // 左侧内容 Widget
      backgroundColor: Colors.cyan[200], // 背景色
      elevation: 10, // 阴影高度
      shape:
          RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), // 形状
      padding: EdgeInsets.all(8), // 内边距
      // margin: EdgeInsets.all(8), // 外边距 不能和width 一起设置,behavior 设置为SnackBarBehavior.fixed时,不能设置margin
      // width: 300, //SnackBar 宽度 不能和margin 一起设置,behavior 设置为SnackBarBehavior.fixed时,不能设置width
      behavior: SnackBarBehavior
          .fixed, // SnackBarBehavior.fixed 是贴合屏幕边框的,SnackBarBehavior.floating 是悬浮出来的一个弹框
      // SnackBarAction,右侧事件按钮
      action: SnackBarAction(
        textColor: Colors.blue[400],
        disabledTextColor: Colors.grey[400],
        onPressed: () {},
        label: "关闭",
      ),
      duration: Duration(milliseconds: 4000), // 弹框展示时长
      // SnackBar 展示在屏幕上时的回调函数
      onVisible: () {},
      dismissDirection: DismissDirection.down, // 消失方向 默认 DismissDirection.down
    );
  }

  SnackBar _baseSnackBar2() {
    return SnackBar(
      content: Text(
          "Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。 [5]  Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。Flutter已推出稳定的2.0版本。"),
      backgroundColor: Colors.amber,
      behavior: SnackBarBehavior.floating,
      margin: EdgeInsets.all(12),
      padding: EdgeInsets.all(8),
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
      duration: Duration(milliseconds: 5000),
      onVisible: () {
        print("onVisible");
      },
      dismissDirection: DismissDirection.up,
      elevation: 10.0,
      action: SnackBarAction(
        label: "OK",
        onPressed: () {
          print("SnackBarAction Clicked");
        },
        textColor: Colors.red[200],
      ),
    );
  }

  SnackBar _customContentSnackBar() {
    return SnackBar(
      content: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          CircleAvatar(
            backgroundImage: AssetImage("assets/images/4.jpeg"),
            radius: 40,
          ),
          SizedBox(width: 8),
          Expanded(
            child: Text(
                "Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。 [5]  Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。Flutter已推出稳定的2.0版本。"),
          ),
        ],
      ),
      behavior: SnackBarBehavior.floating,
      margin: EdgeInsets.all(12),
      padding: EdgeInsets.all(8),
      action: SnackBarAction(
        label: "OK",
        onPressed: () {},
        textColor: Colors.red,
      ),
      backgroundColor: Colors.cyan[200],
      elevation: 8,
    );
  }
}

135.gif
上一篇下一篇

猜你喜欢

热点阅读