Flutter基础Widget--对话框

前言

本文介绍 Flutter 常用对话框 Widget,主要有三个 SimpleDialog、AlertDialog 和 CupertinoAlertDialog,和底部弹出来的对话框 BottomSheet。

一、常用的对话框 Widget

在详细介绍对话框之前,我们先看一下显示对话框的两种方法:

  • showAboutDialog()
  • showDialog()

(1)showAboutDialog():用来弹关于对话框
代码:

import 'package:flutter/material.dart';

class ShowAboutDialogWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ShowAboutDialog',
      theme: ThemeData(primaryColor: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: Text('对话框'),
        ),
        body: Builder(
            builder: (context) => RaisedButton(
                  onPressed: () {
                    showAboutDialog(
                        context: context,
                        applicationName: 'ShowAboutDialog',
                        applicationVersion: '1.0.0');
                  },
                  child: Text('ShowAboutDialog'),
                )),
      ),
    );
  }
}

运行结果:


showAboutDialog 构造函数及参数:

void showAboutDialog({
  @required BuildContext context, //必选,类型 BuildContext,应用上下文
  String applicationName, //可选,类型 String,应用的名字
  String applicationVersion,  //可选,类型 String,应用的版本
  Widget applicationIcon,  //可选,类型 Widget,应用的icon
  String applicationLegalese,  //可选,类型 String,应用的法律信息
  List<Widget> children,  //可选,类型 List<Widget>,添加在后面的 Widget
}) {
    ...
}

(2)showDialog():可以弹很多不同种类的 Dialog。

showDialog() 构造函数及参数说明:

Future<T> showDialog<T>({
  @required BuildContext context, // 必选,类型 BuildContext,应用上下文
  bool barrierDismissible = true, // 可选,类型 bool,点击背景是否可以关闭 dialog。默认为 true,可以关闭
  @Deprecated(
    'Instead of using the "child" argument, return the child from a closure '
    'provided to the "builder" argument. This will ensure that the BuildContext '
    'is appropriate for widgets built in the dialog.'
  ) Widget child, // 可选,类型 Widget,要显示的 Widget,这个已经废弃了,请使用 builder
  WidgetBuilder builder, // 可选,类型 WidgetBuilder,创建要显示的 Widget
}) {
     ···
}

showDialog()的使用方法:

Builder(
    builder: (context) {
        return RaisedButton(
            onPressed: () {
                showDialog(context: context,builder: (context) => xxxDialog(...));
            },
            child: Text('showDialog'),
        );
    },
)

其中 xxxDialog 就是下面我们要介绍的常用Dialog.

1. SimpleDialog

  • 作用:显示有一个标题和多个选项的简单对话框。
  • 代码示例:
import 'package:flutter/material.dart';

class ShowSimpleDialogWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Dialog',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Dialog'),
        ),
        body: Builder(builder: (context) {
          return RaisedButton(
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (context) => SimpleDialog(
                        title: Text('SimpleDialog Demo'),//对话框标题内容
                        children: <Widget>[
                          SimpleDialogOption(//选项按钮
                            child: Text('OK'),
                            onPressed: () {
                              Navigator.of(context).pop();//关闭对话框
                            },
                          ),
                          SimpleDialogOption(
                            child: Text('Cancle'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          )
                        ],
                      ));
            },
            child: Text('showDialog'),//主页面按钮文本内容
          );
        }),
      ),
    );
  }
}
import 'package:flutter/material.dart';

import 'ShowSimpleDialogWidget.dart';

void main() => runApp(ShowSimpleDialogWidget());
  • 运行结果:
  • SimpleDialog 构造函数及参数说明:
class SimpleDialog extends StatelessWidget {
  const SimpleDialog({
    Key key, // 可选;类型 Key;Widget 的标识
    this.title, // 可选;类型 Key;对话框的标题,通常是Text
    this.titlePadding = const EdgeInsets.fromLTRB(24.0, 24.0, 24.0, 0.0),// 可选;类型 EdgeInsetsGeometry;标题的边距
    this.children, // 可选;类型 List<Widget>;对话框的按钮,显示在对话框标题的下面,通常是一组 SimpleDialogOption
    this.contentPadding = const EdgeInsets.fromLTRB(0.0, 12.0, 0.0, 16.0), // 可选;类型 EdgeInsetsGeometry;内容的边距
    this.backgroundColor, // 可选;类型 Color;对话框的背景
    this.elevation, // 可选;类型 double;Button 相对于其父布局放置的z坐标,这可以控制 Button 下的阴影大小,该值必须>=0
    this.semanticLabel, // 可选;类型 String;给文本加上一个语义标签,用于盲人辅助模式下
    this.shape, // 可选;类型 ShapeBorder;Widget 的形状
  }) : assert(titlePadding != null),
       assert(contentPadding != null),
       super(key: key);
    ...   
}
  • SimpleDialogOption 的构造函数及参数说明
class SimpleDialogOption extends StatelessWidget {
  const SimpleDialogOption({
    Key key, // 可选;类型 Key;Widget 的标识
    this.onPressed, // 可选;类型 VoidCallback;点击事件,当手指松开时才触发
    this.child, // 可选;类型 Widget;显示的内容,一般是 Text
  }) : super(key: key);
  ...
}

2. AlertDialog

  • 作用:警告对话框
  • 代码示例:
import 'package:flutter/material.dart';

class AlertDialogWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'AlertDialog',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('AlertDialog'),
        ),
        body: Builder(builder: (context) {
          return RaisedButton(
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (context) => AlertDialog(
                        title: Text('AlertDialog'),
                        content: SingleChildScrollView(
                          child: ListBody(
                            children: <Widget>[
                              Text('Alert Dialog Title'),
                              Text('Alert Dialog context'),
                            ],
                          ),
                        ),
                        actions: <Widget>[
                          FlatButton(
                            child: Text('OK'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          ),
                          FlatButton(
                            child: Text('Cancel'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          )
                        ],
                      ));
            },
            child: Text('showAlertDialog'),
          );
        }),
      ),
    );
  }
}
  • 运行结果:

3. CupertinoAlertDialog

  • 作用:iOS 风格的 AlertDialog
  • 示例代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class ShowCupertinoAlertDialogWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'CupertinoAlertDialog',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('CupertinoAlertDialog'),
        ),
        body: Builder(builder: (context) {
          return RaisedButton(
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (context) => CupertinoAlertDialog(
                        title: Text('CupertinoAlertDialog'),
                        content: Text('This is a CupertinoAlertDialog'),
                        actions: <Widget>[
                          CupertinoDialogAction(
                            child: Text('OK'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          ),
                          CupertinoDialogAction(
                            child: Text('Cancel'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          )
                        ],
                      ));
            },
            child: Text('showDialog'),
          );
        }),
      ),
    );
  }
}
  • 运行结果:

二、底部弹出的对话框 BottomSheet

  • PersistentBottomSheet
  • ModalBottomSheet

1. PersistentBottomSheet

  • 介绍:持续的底部对话框。当 BottomSheet 弹出时,会一直覆盖在 APP 的界面上,而且背景是透明的,所以你还是可以和界面有其他交互,点击背景不能消失,只有返回才会消失。
  • 使用:可以用 Scaffold 的 showBottomSheet() 方法,也可以设置 Scaffold 的 bottomSheet 参数。
  • 代码示例
    (1) showBottomSheet()
import 'package:flutter/material.dart';

class ShowPersistentBottomSheetWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'ShowPersistentBottomSheetWidget',
        home: new Scaffold(
          appBar: new AppBar(
            title: new Text('ShowPersistentBottomSheetWidget'),
          ),
          body: Builder(builder: (context) {
            return RaisedButton(
              onPressed: () {
                showBottomSheet(
                    context: context,
                    builder: (context) => BottomSheet(
                          onClosing: () {},
                          builder: (context) => Container(
                                height: 200.0,
                                color: Colors.blue,
                                child: Center(
                                  child: RaisedButton(
                                    onPressed: () {
                                      Navigator.of(context).pop();
                                    },
                                    child: Text('dismissBottomSheet'),
                                  ),
                                ),
                              ),
                        ));
              },
              child: Text('showBottomDialog'),
            );
          }),
        ));
  }
}

(2)Scaffold 的 bottomSheet 参数
直接给 Scaffold 的 bottomSheet 参数赋 BottomSheet 的实例,这样 Scaffold 一创建的时候就会显示 BottomSheet。

import 'package:flutter/material.dart';

class PersistentBottomSheetWidgetWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'PersistentBottomSheetWidgetWidget',
        home: new Scaffold(
          appBar: new AppBar(
            title: new Text('PersistentBottomSheetWidgetWidget'),
          ),
          body: Builder(builder: (context) {
            return RaisedButton(
              onPressed: () {},
              child: Text('showBottomSheet'),
            );
          }),
          bottomSheet: BottomSheet(
              onClosing: () {},
              builder: (context) => Container(
                    height: 200.0,
                    color: Colors.blue,
                    child: Center(
                      child: RaisedButton(
                        onPressed: () {
                          Navigator.of(context).pop();
                        },
                        child: Text('dismissBottomSheet'),
                      ),
                    ),
                  )),
        ));
  }
}
  • 运行结果:

    当 PersistentBottomSheet 出现时,TitleBar 的右上角会多一个返回的按钮可以关闭弹窗。

2. ModalBottomSheet

  • 介绍:有半透明背景的对话框。类似 Dialog,有一个半透明的背景层,点击背景会消失。
  • 使用:只能用 showModalBottomSheet()方法。
  • 代码示例:
import 'package:flutter/material.dart';

class ShowModalBottomSheetWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'ShowModalBottomSheetWidget',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('ShowModalBottomSheetWidget'),
        ),
        body: Builder(builder: (context) {
          return RaisedButton(
            onPressed: () {
              showModalBottomSheet(
                  context: context,
                  builder: (context) => BottomSheet(
                        onClosing: () {},
                        builder: (context) => Container(
                              height: 200.0,
                              color: Colors.blue,
                              child: Center(
                                child: RaisedButton(
                                  onPressed: () {
                                    Navigator.of(context).pop();
                                  },
                                  child: Text('dismissBottomSheet'),
                                ),
                              ),
                            ),
                      ));
            },
            child: Text('showBottomSheet'),
          );
        }),
      ),
    );
  }
}
  • 运行结果:
  • showModalBottomSheet() 方法的定义和参数说明:

Future<T> showModalBottomSheet<T>({
  @required BuildContext context, // 必选;类型 BuildContext;应用上下文
  @required WidgetBuilder builder,// 必选;类型 WidgetBuilder;要显示的 BottomSheet
}) {
     ...
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容