亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Flutter 底部彈窗ModelBottomSheet的使用示例

 更新時(shí)間:2021年06月07日 11:51:35   作者:島上碼農(nóng)  
在實(shí)際開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)用到底部彈窗來(lái)進(jìn)行快捷操作,例如選擇一個(gè)選項(xiàng),選擇下一步操作等等。在 Flutter 中提供了一個(gè) showModelBottomSheet 方法用于彈出底部彈窗,本篇介紹如何使用底部彈窗。

實(shí)現(xiàn)效果

最終實(shí)現(xiàn)效果如圖片所示,分布演示了基礎(chǔ)的,全屏的和自定義的底部彈窗形式。

代碼結(jié)構(gòu)

在消息頁(yè)面 message.dart 中,使用 Column 組件構(gòu)建了三個(gè)按鈕,點(diǎn)擊每個(gè)按鈕調(diào)用不同的底部彈窗顯示。這部分代碼不展示,核心注意的方式是按鈕的 onPressed 響應(yīng)方法,需要使用 async 修飾,這是因?yàn)?ModalBottomSheet 的返回結(jié)果是一個(gè) Future 對(duì)象,需要通過(guò) await 來(lái)獲取返回結(jié)果。

onPressed: () async {
  int selectedIndex = await _showCustomModalBottomSheet(context, _options);
  print("自定義底部彈層:選中了第$selectedIndex個(gè)選項(xiàng)");
},
//...

基本使用

基本使用對(duì)于全屏和默認(rèn)只差一個(gè)參數(shù),演示代碼中,我們使用了一組模擬的數(shù)據(jù)構(gòu)建選項(xiàng)數(shù)據(jù),然后再傳給顯示底部彈窗的方法,實(shí)際這組數(shù)據(jù)大部分是從后臺(tái)獲取的。當(dāng) isScrollControlled 是 true 時(shí),則是全屏彈窗,默認(rèn)是 false。

Future<int> _showBasicModalBottomSheet(context, List<String> options) async {
    return showModalBottomSheet<int>(
      isScrollControlled: false,
      context: context,
      builder: (BuildContext context) {
        return ListView.builder(
          itemBuilder: (BuildContext context, int index) {
            return ListTile(
                title: Text(options[index]),
                onTap: () {
                  Navigator.of(context).pop(index);
                });
          },
          itemCount: options.length,
        );
      },
    );
  }

需要注意的有四點(diǎn):

  • 彈窗需要上下文的 context,這是因?yàn)閷?shí)際頁(yè)面展示是通過(guò) Navigator 的 push 方法導(dǎo)航的新的頁(yè)面完成的。
  • 彈窗的組件構(gòu)建的 builder 方法,這里可以返回自己自定義的組件,后面的自定義組件就是在這里做文章。
  • 在列表的元素的選中點(diǎn)擊事件 onTap 方法中,需要使用 Navigator的 pop 方法返回上一個(gè)頁(yè)面,這里可以攜帶選中的下標(biāo)(或其他值)返回,上一個(gè)頁(yè)面可以使用 await 的方式接收對(duì)應(yīng)返回的結(jié)果。
  • 點(diǎn)擊蒙層也可以消失,這時(shí)候?qū)嶋H調(diào)用的方法是 Navigator.of(context).pop()。因?yàn)闆](méi)有攜帶參數(shù),所以接收的結(jié)果是 null,需要特殊處理一下。

自定義底部彈窗

在自定義底部彈窗中,我們做了如下自定義項(xiàng):

  • 彈窗的高度指定為屏幕高度的一半,這可以通過(guò)自定義組件的 Container 高度實(shí)現(xiàn)。
  • 增加了標(biāo)題欄,且標(biāo)題欄有關(guān)閉按鈕:標(biāo)題在整個(gè)標(biāo)題欄是居中的,而關(guān)閉按鈕是在標(biāo)題欄右側(cè)頂部。這可以通過(guò) Stack 堆棧布局組件實(shí)現(xiàn)不同的組件層疊及位置。
  • 左上角和右上角做了圓角處理,這個(gè)可以通過(guò) Container 的裝飾完成,但需要注意的是,由于底部彈窗默認(rèn)是有顏色的,因此要顯示出圓角需要將底部彈窗的顏色設(shè)置為透明。

自定義彈窗的代碼如下所示:

Future<int> _showCustomModalBottomSheet(context, List<String> options) async {
  return showModalBottomSheet<int>(
    backgroundColor: Colors.transparent,
    isScrollControlled: true,
    context: context,
    builder: (BuildContext context) {
      return Container(
        clipBehavior: Clip.antiAlias,
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
            topLeft: const Radius.circular(20.0),
            topRight: const Radius.circular(20.0),
          ),
        ),
        height: MediaQuery.of(context).size.height / 2.0,
        child: Column(children: [
          SizedBox(
            height: 50,
            child: Stack(
              textDirection: TextDirection.rtl,
              children: [
                Center(
                  child: Text(
                    '底部彈窗',
                    style: TextStyle(
                        fontWeight: FontWeight.bold, fontSize: 16.0),
                  ),
                ),
                IconButton(
                    icon: Icon(Icons.close),
                    onPressed: () {
                      Navigator.of(context).pop();
                    }),
              ],
            ),
          ),
          Divider(height: 1.0),
          Expanded(
            child: ListView.builder(
              itemBuilder: (BuildContext context, int index) {
                return ListTile(
                    title: Text(options[index]),
                    onTap: () {
                      Navigator.of(context).pop(index);
                    });
              },
              itemCount: options.length,
            ),
          ),
        ]),
      );
    },
  );
}

這里有幾個(gè)額外需要注意的點(diǎn):

  • 獲取屏幕的尺寸可以使用MediaQuery.of(context).size屬性完成。
  • Stack 組件根據(jù)子元素的次序依次堆疊,最后面的在最頂層。textDirection 用于排布起始位置。
  • 由于 Column 下面嵌套了一個(gè) ListView,因此需要使用 Expanded 將 ListView 包裹起來(lái),以便有足夠的空間供 ListView 的內(nèi)容區(qū)滾動(dòng),否則會(huì)報(bào)布局溢出警告。

總結(jié)

本篇介紹了三種 ModalBottomSheet 的方式, 可以看到 ModalBottomSheet 非常靈活。實(shí)際開(kāi)發(fā)過(guò)程中,還可以根據(jù)需要,利用 ModalBottomSheet的 builder 方法返回不同的組件進(jìn)而定制自己的底部彈層組件,能夠滿足絕大多數(shù)場(chǎng)景。同時(shí),借 ModalBottomSheet 的啟發(fā),我們自己也可以使用 Navigator方法來(lái)實(shí)現(xiàn)其他形式的彈層,例如從底部彈出登錄頁(yè),登錄后再返回原頁(yè)面。

以上就是Flutter 底部彈窗ModelBottomSheet的使用示例的詳細(xì)內(nèi)容,更多關(guān)于Flutter 底部彈窗ModelBottomSheet的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android framework ATMS啟動(dòng)流程

    Android framework ATMS啟動(dòng)流程

    這篇文章主要為大家介紹了Android framework ATMS啟動(dòng)流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android 自定義底部上拉控件的實(shí)現(xiàn)方法

    Android 自定義底部上拉控件的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇Android 自定義底部上拉控件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Android方向傳感器的使用方法

    Android方向傳感器的使用方法

    這篇文章主要介紹了Android方向傳感器的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • android之自定義Toast使用方法

    android之自定義Toast使用方法

    有時(shí)我們的程序使用默認(rèn)的Toast時(shí)會(huì)和程序的整體風(fēng)格不搭配,這個(gè)時(shí)候我們就需要自定義Toast,使其與我們的程序更加融合,使用自定義Toast,首先我們需要添加一個(gè)布局文件,該布局文件的結(jié)構(gòu)和Activity使用的布局文件結(jié)構(gòu)一致,在該布局文件中我們需設(shè)計(jì)我們Toast的布局
    2013-01-01
  • android 上傳文件到服務(wù)器代碼實(shí)例

    android 上傳文件到服務(wù)器代碼實(shí)例

    這篇文章主要介紹了android 上傳文件到服務(wù)器的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2013-12-12
  • 詳細(xì)解讀Android系統(tǒng)中的application標(biāo)簽

    詳細(xì)解讀Android系統(tǒng)中的application標(biāo)簽

    這篇文章主要介紹了Android系統(tǒng)中的application標(biāo)簽,以application來(lái)聲明App是Android入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-04-04
  • Android創(chuàng)建服務(wù)之started service詳細(xì)介紹

    Android創(chuàng)建服務(wù)之started service詳細(xì)介紹

    這篇文章主要介紹了Android創(chuàng)建服務(wù)之started service,需要的朋友可以參考下
    2014-02-02
  • Android Dialog對(duì)話框?qū)嵗a講解

    Android Dialog對(duì)話框?qū)嵗a講解

    本文通過(guò)實(shí)例代碼給大家介紹了Android Dialog對(duì)話框的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Android自定義View中attrs.xml的實(shí)例詳解

    Android自定義View中attrs.xml的實(shí)例詳解

    這篇文章主要介紹了Android自定義View中attrs.xml的實(shí)例詳解的相關(guān)資料,在自定義View首先對(duì)attrs.xml進(jìn)行布局的實(shí)現(xiàn)及屬性的應(yīng)用,需要的朋友可以參考下
    2017-07-07
  • Android仿微信圖片選擇器ImageSelector使用詳解

    Android仿微信圖片選擇器ImageSelector使用詳解

    這篇文章主要為大家詳細(xì)介紹了Android仿微信圖片選擇器ImageSelector的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評(píng)論