黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Flutter 彈框全解析

Flutter 彈框全解析

來源:千鋒教育
發(fā)布人:xqq
時間: 2023-11-23 00:39:12 1700671152

一、基礎(chǔ)概念

Flutter中的彈框分為兩種類型:Dialog和BottomSheet。Dialog一般指具有模態(tài)的彈框,使用showDialog函數(shù)實(shí)現(xiàn);而BottomSheet一般指非模態(tài)的彈框,使用showModalBottomSheet實(shí)現(xiàn)。除此之外,還有一些其他類型的彈框,如底部菜單彈框,選擇器彈框等,這里就不一一列舉了。

Flutter的彈框構(gòu)造器通常包括以下幾個部分:彈框主體Widget、背景遮罩Widget、動畫控制器、彈框位置等等。接下來我們會重點(diǎn)講述這些部分的實(shí)現(xiàn)過程。

二、Dialog的實(shí)現(xiàn)

Dialog是模態(tài)的彈框類型,即彈框出現(xiàn)時,背景被遮擋且無法操作。

1、彈框主體Widget

在Flutter中,Dialog通常由一個AlertDialog Widget或SimpleDialog Widget構(gòu)成。其中AlertDialog可以自定義其標(biāo)題、內(nèi)容和按鈕;而SimpleDialog只包含多個選項(xiàng)。

AlertDialog的構(gòu)建過程類似下面的代碼:


showDialog(
  context: context,
  builder: (BuildContext context) {
    return AlertDialog(
      title: Text("彈框標(biāo)題"),
      content: Text("彈框內(nèi)容"),
      actions: [
        FlatButton(
          child: Text("取消"),
          onPressed: () {
            Navigator.of(context).pop();  // 關(guān)閉彈框
          },
        ),
        FlatButton(
          child: Text("確定"),
          onPressed: () {
            // 實(shí)現(xiàn)確認(rèn)邏輯
          },
        ),
      ],
    );
  },
);

2、背景遮罩Widget

這里我們使用了showDialog函數(shù)來構(gòu)建Dialog,同時此函數(shù)還允許我們自定義彈框顯示時的遮罩背景。這可以通過指定barrierColor、barrierOpacity和barrierDismissible等屬性來實(shí)現(xiàn)。其中,barrierColor和barrierOpacity用于設(shè)置遮罩的顏色和透明度,而barrierDismissible則用于控制是否允許用戶點(diǎn)擊遮罩背景來關(guān)閉彈框(即點(diǎn)擊空白處關(guān)閉彈框)。


showDialog(
  context: context,
  barrierColor: Colors.black12,  // 遮罩顏色
  barrierOpacity: 0.5,  // 遮罩透明度
  barrierDismissible: false,  // 是否允許點(diǎn)擊空白處關(guān)閉彈框
  builder: (BuildContext context) {
    return AlertDialog(
      //...
    );
  },
);

3、動畫控制器

想要Dialog具有更好的動畫效果,我們可以使用Flutter內(nèi)置的動畫庫Animations。通過AnimatedWidget或AnimatedBuilder等頂層Widget,我們可以方便地構(gòu)建各種動畫效果。這里以FadeTransition為例,演示如何實(shí)現(xiàn)Dialog的淡入淡出效果。


class MyDialog extends StatefulWidget {
  const MyDialog({Key key}) : super(key: key);

  @override
  _MyDialogState createState() => _MyDialogState();
}

class _MyDialogState extends State with SingleTickerProviderStateMixin {
  AnimationController _controller;
  Animation _animation;

  @override
  void initState() {
    super.initState();

    _controller = AnimationController(
      duration: const Duration(milliseconds: 500),
      vsync: this,
    );
    _animation = CurvedAnimation(parent: _controller, curve: Curves.easeOut);

    _controller.forward();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return FadeTransition(
      opacity: _animation,
      child: Center(
        child: AlertDialog(
          title: Text("彈框標(biāo)題"),
          content: Text("彈框內(nèi)容"),
          actions: [
            FlatButton(
              child: Text("取消"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
            FlatButton(
              child: Text("確定"),
              onPressed: () {
                //...
              },
            ),
          ],
        ),
      ),
    );
  }
}

void showMyDialog(BuildContext context) {
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return MyDialog();
    },
  );
}

三、BottomSheet的實(shí)現(xiàn)

BottomSheet是非模態(tài)的彈框類型,即彈框出現(xiàn)時,背景不被遮擋且可以進(jìn)行操作。BottomSheet有兩種類型:PersistentBottomSheet和ModalBottomSheet。其中,PersistentBottomSheet會一直保持顯示直至手動關(guān)閉,而ModalBottomSheet會在點(diǎn)擊某個按鈕后彈出,在外部區(qū)域進(jìn)行操作時自動隱藏。

1、彈框主體Widget

在Flutter中,BottomSheet的構(gòu)建器是builder屬性,它是個函數(shù)類型,返回一個Widget。另外我們也可以使用官方提供的BottomSheet Widget。與Dialog不同,BottomSheet不包含標(biāo)題和按鈕等元素,通常只包含一部分滾動內(nèi)容。


ModalBottomSheet(
  builder: (BuildContext context) {
    return Container(
      height: 200.0,
      child: ListView(
        children: [
          ListTile(title: Text('選項(xiàng)1')),
          ListTile(title: Text('選項(xiàng)2')),
          ListTile(title: Text('選項(xiàng)3')),
          ListTile(title: Text('選項(xiàng)4')),
        ],
      ),
    );
  },
);

2、背景遮罩Widget

與Dialog類似,BottomSheet也有相應(yīng)的遮罩背景設(shè)置屬性。但由于其本身不是模態(tài)的,所以不需要只讀化背景,也就意味著無需設(shè)置barrierDismissible屬性。


showModalBottomSheet(
  context: context,
  backgroundColor: Colors.black12,  // 設(shè)置背景色
  builder: (BuildContext context) {
    return Container(
      height: 200.0,
      child: ListView(
        children: [
          //...
        ],
      ),
    );
  },
);

3、動畫控制器

維護(hù)動畫控制器實(shí)現(xiàn)BottomSheet的進(jìn)入和退出動畫。


class MyBottomSheet extends StatefulWidget {
  const MyBottomSheet({Key key}) : super(key: key);

  @override
  _MyBottomSheetState createState() => _MyBottomSheetState();
}

class _MyBottomSheetState extends State with SingleTickerProviderStateMixin {
  AnimationController _controller;
  Animation _animation;

  @override
  void initState() {
    super.initState();

    _controller = AnimationController(
      duration: const Duration(milliseconds: 500),
      vsync: this,
    );
    _animation = CurvedAnimation(parent: _controller, curve: Curves.easeOut);

    _controller.forward();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SlideTransition(
      position: Tween(
        begin: Offset(0.0, 1.0),
        end: Offset(0.0, 0.0),
      ).animate(_controller),
      child: Container(
        height: 200.0,
        child: ListView(
          children: [
            //...
          ],
        ),
      ),
    );
  }
}

void showMyBottomSheet(BuildContext context) {
  showModalBottomSheet(
    context: context,
    builder: (BuildContext context) {
      return MyBottomSheet();
    },
  );
}

四、結(jié)語

以上就是Flutter彈框的實(shí)現(xiàn)方案。除了這兩種類型外,還有很多其他類型的彈框類型,每種類型都有自己的實(shí)現(xiàn)方式。我們需要具體問題具體分析,靈活運(yùn)用。在實(shí)踐中不斷探索,準(zhǔn)確地找到需要用到的彈框類型,并實(shí)現(xiàn)對應(yīng)的構(gòu)造器。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
天天做人人爱夜夜爽2020 | 天天色成人| 久久国产精品只做精品| 国产网站在线| 欧美激情一区二区三区视频 | 久久99中文字幕久久| 日韩免费在线视频| 超级乱淫黄漫画免费| 99色视频在线观看| 可以在线看黄的网站| 黄色福利片| 久久国产精品自线拍免费| 天天做日日爱| 国产国语对白一级毛片| 精品久久久久久影院免费| 欧美国产日韩精品| 色综合久久手机在线| 亚洲天堂免费| 99久久精品国产免费| 国产a视频精品免费观看| 成人免费一级纶理片| 精品美女| 夜夜操天天爽| 精品国产一区二区三区久 | 国产精品免费久久| 99久久精品国产国产毛片| 99色视频| 成人免费网站视频ww| 一级女性全黄久久生活片| 夜夜操天天爽| 精品国产一级毛片| 精品国产香蕉在线播出| 四虎精品在线观看| 精品久久久久久中文字幕一区 | 欧美电影免费| 成人免费福利片在线观看| 国产一级强片在线观看| 国产网站免费视频| 日日夜夜婷婷| 亚洲第一页乱| 国产麻豆精品高清在线播放| 久久国产精品只做精品| 精品视频一区二区三区免费| 国产不卡在线播放| 成人免费高清视频| 九九精品在线| 国产麻豆精品免费视频| 久久国产一区二区| 日本特黄特色aa大片免费| 日韩男人天堂| 精品美女| 精品国产三级a| 亚洲第一色在线| 一级毛片视频播放| 天天做日日爱夜夜爽| 九九久久99综合一区二区| 午夜久久网| 久久国产影视免费精品| 国产成+人+综合+亚洲不卡| 91麻豆国产| 久久精品道一区二区三区| 美女免费精品高清毛片在线视 | 91麻豆精品国产高清在线| 久久精品免视看国产成人2021| 午夜在线影院| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产91丝袜在线播放0| 久久国产一区二区| 国产成a人片在线观看视频| 99久久精品费精品国产一区二区| 毛片成人永久免费视频| 色综合久久天天综线观看| 色综合久久天天综合绕观看| 亚洲 欧美 91| 亚洲精品久久久中文字| 午夜激情视频在线播放| 欧美大片毛片aaa免费看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品视频一区二区| 国产精品1024在线永久免费| 欧美激情在线精品video| 国产一区二区精品久久91| 国产精品自拍在线| 成人影视在线播放| 国产一区国产二区国产三区| 欧美a级大片| 国产不卡在线播放| 日韩中文字幕在线亚洲一区 | 欧美18性精品| 亚洲天堂免费观看| 天天做日日爱夜夜爽| 国产精品免费久久| 高清一级淫片a级中文字幕| 国产美女在线观看| 久久精品免视看国产成人2021| 美女免费精品高清毛片在线视 | 欧美激情一区二区三区视频高清| 亚久久伊人精品青青草原2020| 亚洲第一色在线| 欧美α片无限看在线观看免费| 久久精品店| 欧美a级片免费看| 超级乱淫黄漫画免费| 亚洲第一色在线| 久久国产一区二区| 欧美爱爱网| 中文字幕一区二区三区 精品 | 在线观看成人网 | 成人免费一级纶理片| 日韩中文字幕一区| 日韩专区亚洲综合久久| 可以免费看毛片的网站| 精品视频免费看| 欧美电影免费| 91麻豆精品国产自产在线观看一区| 欧美1卡一卡二卡三新区| 欧美激情一区二区三区在线播放 | 青青久久网| 黄色福利片| 欧美a免费| 午夜在线亚洲| 国产不卡福利| 韩国三级香港三级日本三级| 九九干| 国产视频一区二区三区四区 | 国产精品免费久久| 久久成人亚洲| 天天做日日干| 精品国产香蕉伊思人在线又爽又黄| 国产网站免费视频| 国产原创中文字幕| 欧美激情影院| 亚洲爆爽| 美女免费精品视频在线观看| 成人高清护士在线播放| 日日夜人人澡人人澡人人看免| 国产不卡高清在线观看视频| 精品在线观看一区| 精品国产香蕉伊思人在线又爽又黄| 国产美女在线观看| 亚洲精品中文一区不卡| 国产视频一区二区在线观看| 免费国产一级特黄aa大片在线| a级毛片免费观看网站| 超级乱淫伦动漫| 国产一区国产二区国产三区| 成人免费观看的视频黄页| 久久精品道一区二区三区| 日韩在线观看视频黄| 久久成人亚洲| 国产91精品露脸国语对白| 99久久精品费精品国产一区二区| 国产一区二区精品久久| 精品久久久久久影院免费| 青青久久精品| 国产精品免费久久| 日本免费乱理伦片在线观看2018| 国产伦精品一区三区视频| 欧美国产日韩在线| 欧美激情影院| 日韩一级精品视频在线观看| 国产高清在线精品一区a| 国产精品自拍亚洲| 欧美1卡一卡二卡三新区| 青青久在线视频| 国产亚洲精品成人a在线| 国产网站在线| 精品国产亚一区二区三区| 九九精品久久| 国产综合成人观看在线| 日本免费乱理伦片在线观看2018| 日本免费乱理伦片在线观看2018| 九九精品久久| 国产视频久久久久| 日日夜夜婷婷| 国产精品1024永久免费视频| 国产网站麻豆精品视频| 日韩中文字幕在线亚洲一区 | 久久国产精品自由自在| 国产a毛片| 久久99欧美| 成人a大片高清在线观看| 成人影视在线播放| 国产网站免费| 成人高清免费| 亚洲天堂免费| 天天做日日爱夜夜爽| 国产网站免费视频| 四虎影视久久久| 可以免费在线看黄的网站| 久久成人亚洲| 精品视频在线观看视频免费视频| 午夜欧美福利| 日韩av东京社区男人的天堂| 成人a级高清视频在线观看| 四虎影视久久| 精品视频在线观看免费| 欧美国产日韩一区二区三区| 精品视频一区二区三区免费| 91麻豆精品国产自产在线|