Flutter基礎Widget--對話框

前言

本文介紹 Flutter 常用對話框 Widget妒貌,主要有三個 SimpleDialog取具、AlertDialog 和 CupertinoAlertDialog,和底部彈出來的對話框 BottomSheet谦去。

一攒巍、常用的對話框 Widget

在詳細介紹對話框之前,我們先看一下顯示對話框的兩種方法:

  • showAboutDialog()
  • showDialog()

(1)showAboutDialog():用來彈關(guān)于對話框
代碼:

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'),
                )),
      ),
    );
  }
}

運行結(jié)果:


showAboutDialog 構(gòu)造函數(shù)及參數(shù):

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() 構(gòu)造函數(shù)及參數(shù)說明:

Future<T> showDialog<T>({
  @required BuildContext context, // 必選积仗,類型 BuildContext,應用上下文
  bool barrierDismissible = true, // 可選蜕猫,類型 bool寂曹,點擊背景是否可以關(guān)閉 dialog。默認為 true回右,可以關(guān)閉
  @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翔烁,這個已經(jīng)廢棄了渺氧,請使用 builder
  WidgetBuilder builder, // 可選,類型 WidgetBuilder蹬屹,創(chuàng)建要顯示的 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'),//對話框標題內(nèi)容
                        children: <Widget>[
                          SimpleDialogOption(//選項按鈕
                            child: Text('OK'),
                            onPressed: () {
                              Navigator.of(context).pop();//關(guān)閉對話框
                            },
                          ),
                          SimpleDialogOption(
                            child: Text('Cancle'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          )
                        ],
                      ));
            },
            child: Text('showDialog'),//主頁面按鈕文本內(nèi)容
          );
        }),
      ),
    );
  }
}
import 'package:flutter/material.dart';

import 'ShowSimpleDialogWidget.dart';

void main() => runApp(ShowSimpleDialogWidget());
  • 運行結(jié)果:
  • SimpleDialog 構(gòu)造函數(shù)及參數(shù)說明:
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岁经;內(nèi)容的邊距
    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 的構(gòu)造函數(shù)及參數(shù)說明
class SimpleDialogOption extends StatelessWidget {
  const SimpleDialogOption({
    Key key, // 可選蛤织;類型 Key;Widget 的標識
    this.onPressed, // 可選鸿染;類型 VoidCallback指蚜;點擊事件,當手指松開時才觸發(fā)
    this.child, // 可選涨椒;類型 Widget摊鸡;顯示的內(nèi)容,一般是 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'),
          );
        }),
      ),
    );
  }
}
  • 運行結(jié)果:

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'),
          );
        }),
      ),
    );
  }
}
  • 運行結(jié)果:

二蚕冬、底部彈出的對話框 BottomSheet

  • PersistentBottomSheet
  • ModalBottomSheet

1. PersistentBottomSheet

  • 介紹:持續(xù)的底部對話框免猾。當 BottomSheet 彈出時,會一直覆蓋在 APP 的界面上囤热,而且背景是透明的掸刊,所以你還是可以和界面有其他交互,點擊背景不能消失赢乓,只有返回才會消失。
  • 使用:可以用 Scaffold 的 showBottomSheet() 方法石窑,也可以設置 Scaffold 的 bottomSheet 參數(shù)牌芋。
  • 代碼示例
    (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 參數(shù)
直接給 Scaffold 的 bottomSheet 參數(shù)賦 BottomSheet 的實例,這樣 Scaffold 一創(chuàng)建的時候就會顯示 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'),
                      ),
                    ),
                  )),
        ));
  }
}
  • 運行結(jié)果:

    當 PersistentBottomSheet 出現(xiàn)時躺屁,TitleBar 的右上角會多一個返回的按鈕可以關(guān)閉彈窗。

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'),
          );
        }),
      ),
    );
  }
}
  • 運行結(jié)果:
  • showModalBottomSheet() 方法的定義和參數(shù)說明:

Future<T> showModalBottomSheet<T>({
  @required BuildContext context, // 必選徊都;類型 BuildContext;應用上下文
  @required WidgetBuilder builder,// 必選广辰;類型 WidgetBuilder暇矫;要顯示的 BottomSheet
}) {
     ...
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市择吊,隨后出現(xiàn)的幾起案子李根,更是在濱河造成了極大的恐慌,老刑警劉巖几睛,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件房轿,死亡現(xiàn)場離奇詭異,居然都是意外死亡所森,警方通過查閱死者的電腦和手機囱持,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來必峰,“玉大人洪唐,你說我怎么就攤上這事『鹨希” “怎么了凭需?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肝匆。 經(jīng)常有香客問我粒蜈,道長,這世上最難降的妖魔是什么旗国? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任枯怖,我火速辦了婚禮,結(jié)果婚禮上能曾,老公的妹妹穿的比我還像新娘度硝。我一直安慰自己,他們只是感情好寿冕,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布蕊程。 她就那樣靜靜地躺著,像睡著了一般驼唱。 火紅的嫁衣襯著肌膚如雪藻茂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音辨赐,去河邊找鬼优俘。 笑死,一個胖子當著我的面吹牛掀序,可吹牛的內(nèi)容都是我干的帆焕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼森枪,長吁一口氣:“原來是場噩夢啊……” “哼视搏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起县袱,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浑娜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后式散,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筋遭,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年暴拄,在試婚紗的時候發(fā)現(xiàn)自己被綠了漓滔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡乖篷,死狀恐怖响驴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撕蔼,我是刑警寧澤豁鲤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鲸沮,受9級特大地震影響琳骡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讼溺,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一楣号、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怒坯,春花似錦炫狱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艳馒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弄慰。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工第美, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陆爽。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓什往,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慌闭。 傳聞我的和親對象是個殘疾皇子别威,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容