美文网首页Flutter
实现Flutter弹窗的正确姿势

实现Flutter弹窗的正确姿势

作者: 锐心凌志 | 来源:发表于2019-08-01 20:30 被阅读63次

Dialog 在现代的视觉交互中是很常用的一种 UI。

做移动端开发的同学一定对它不陌生。

本篇将会探索一下,在 Flutter 中如何构建一个 Dialog UI。

1.如何展示一个Dialog?

1.导入 material 插件

'package:flutter/material.dart'
复制代码

2.调用 showDialog() 来展示一个 Dialog

Future<T> showDialog<T>({
  @required BuildContext context,
  // 点击 dialog 外部是否可消失
  bool barrierDismissible = true,
  // 构建 Dialog 视图
  WidgetBuilder builder,
})
复制代码

没错,只需要调用这个简单的函数就可以展示一个 Dialog。

重点是,在 builder 中构建你的 Dialog 视图。

这是一个简单的例子:

showDialog(
  // 传入 context
  context: context,
  // 构建 Dialog 的视图
  builder: (_) => Padding(
        padding: EdgeInsets.all(16),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Container(
              alignment: Alignment.center,
              color: Colors.white,
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.only(top: 8),
                    child: Text('Custom Dialog',
                        style: TextStyle(
                            fontSize: 16,
                            decoration: TextDecoration.none)),
                  ),
                  Padding(
                    padding: EdgeInsets.only(top: 15, bottom: 8),
                    child: FlatButton(
                        onPressed: () {
                          // 关闭 Dialog
                          Navigator.pop(_);
                        },
                        child: Text('确定')),
                  )
                ],
              ),
            )
          ],
        ),
      ),
);
复制代码

其实和平时构建一个页面没多大区别,只不过是在 showDialog()builder 中构建。

如果你注意细节的话,你会发现上面代码中有一行:

Navigator.pop(_);
复制代码

它就是用来关闭 Dialog 的操作。

还记得 Navigator 吗?

它是用来进行页面跳转的,也许你可以看看 《8.页面跳转》 来回顾回顾。

这意味着,弹出一个 Dialog,实际上就是打开了一个 Dialog 风格的页面!!😺

跟踪源码会发现,在 showDialog() 的最后实现中,实际是这样的:

Navigator.of(context, rootNavigator: true).push<T>(_DialogRoute<T>(
    pageBuilder: pageBuilder,
    barrierDismissible: barrierDismissible,
    barrierLabel: barrierLabel,
    barrierColor: barrierColor,
    transitionDuration: transitionDuration,
    transitionBuilder: transitionBuilder,
  ))
复制代码

🥶 可不就是打开了一个页面嘛..

2.常用 Dialog

Flutter 当然会提供一些 Dialog 的封装,帮助开发者快速的构建常用的 Dialog。

2.1 SimpleDialog

先看看 SimpleDialog 有些什么常用参数:

属性 类型 说明
title Widget Dialog的标题
titlePadding EdgeInsetsGeometry title周围的 Padding
children List child内容数组,会从上到下的排列 child
contentPadding EdgeInsetsGeometry 内容区域周围的 Padding
backgroundColor Color Dialog的背景色
elevation double Dialog 的悬浮高度,和阴影效果有关
shape ShapeBorder Dialog的边框形状

🌰 e.g.:

showDialog(
  context: context,
  builder: (ctx) {
    return SimpleDialog(
      title: Text("SimpleDialog"),
      titlePadding: EdgeInsets.all(10),
      backgroundColor: Colors.amber,
      elevation: 5,
      shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(6))),
      children: <Widget>[
        ListTile(
          title: Center(child: Text("Item_1"),),
        ),
        ListTile(
          title: Center(child: Text("Item_2"),),
        ),
        ListTile(
          title: Center(child: Text("Item_3"),),
        ),
        ListTile(
          title: Center(child: Text("Close"),),
          onTap: (){
            Navigator.pop(context);
          },
        ),
      ],
    );
  });
复制代码

2.2 AlertDialog

Flutter 帮助我们封装了 AlertDialog 来方便的实现这种样式。

看看 AlertDialog 有哪些常用的属性:

属性 类型 说明
title Widget Dialog的标题
titlePadding EdgeInsetsGeometry title周围的 Padding
content Widget Dialog 中间的内容
contentPadding EdgeInsetsGeometry 内容区域周围的 Padding
backgroundColor Color Dialog的背景色
elevation double Dialog 的悬浮高度,和阴影效果有关
shape ShapeBorder Dialog的边框形状
actions List 通常为Dialog底部的操作按钮

🌰 e.g.:

showDialog(
  context: context,
  builder: (context) => AlertDialog(
        title: Text('Dialog'),
        content: Text(('Dialog content..')),
        actions: <Widget>[
          new FlatButton(
            child: new Text("取消"),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
          new FlatButton(
            child: new Text("确定"),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      ));
复制代码

这就是上图中的 Dialog 的实现。

相关文章

  • 实现Flutter弹窗的正确姿势

    Dialog 在现代的视觉交互中是很常用的一种 UI。 做移动端开发的同学一定对它不陌生。 本篇将会探索一下,在 ...

  • Flutter Alert封装

    Flutter提供的有showDialog,showModalBottomSheet等方式实现弹窗,本文是基于Ov...

  • Flutter 实现多选弹窗

    在Flutter 底部弹窗详解[https://www.jianshu.com/p/34f7b9724a41]一篇...

  • Flutter Tips - 单例

    在Flutter中的单例模式怎么实现呢?换句话说,Flutter中我们怎么以标准的姿势实现一个单例呢?下面我们就开...

  • Flutter 错误捕获的正确姿势

    背景 我们知道,在软件开发过程中,错误和异常总是在所难免。 不管是客户端的逻辑错误导致的,还是服务器的数据问题导致...

  • Flutter关闭键盘的正确姿势

    目录:本文包含以下两部分内容: 关闭键盘后正确方法 点击页面空白区域关闭键盘 一、关闭键盘后正确方法 Flutte...

  • flutter弹窗插件 -- oktoast

    flutter 开发中常用的弹窗插件oktoast,使用非常简单插件地址:oktoast | Flutter Pa...

  • Flutter 弹窗

    1、showDialogshowDialog:半透明背景弹窗 打电话弹窗:AlertDialog:alert内容B...

  • flutter弹窗

    一、iOS风格弹窗 风格一: 风格二: 风格三: 风格四:底部 二、GetX的Dialog风格 1、自定义的 2、...

  • iOS 使用高德地图正确姿势(三)

    iOS 使用高德地图正确姿势(一)iOS 使用高德地图正确姿势(二) 实现大头针始终在地图中心,拖动地图实时poi...

网友评论

    本文标题:实现Flutter弹窗的正确姿势

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