欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?Flutter中Offstage組件的使用教程詳解

 更新時(shí)間:2023年02月01日 11:18:09   作者:程序那些事  
這篇文章主要為大家詳細(xì)介紹了Android?Flutter中Offstage組件的使用教程,文中的示例代碼講解詳細(xì),對(duì)我們了解Flutter有一定的幫助,需要的可以參考一下

簡(jiǎn)介

我們?cè)谑褂胒lutter的過(guò)程中,有時(shí)候需要控制某些組件是否展示,一種方法是將這個(gè)組件從render tree中刪除,這樣這個(gè)組件就相當(dāng)于沒(méi)有出現(xiàn)一樣,但是有時(shí)候,我們只是不想展示這個(gè)widget,但是這個(gè)組件還是存在的,并且可以接受鍵盤輸入,還可以使用CPU。它和真正的組件唯一不同的就是他是不可見(jiàn)的。

這樣的組件就叫做Offstage。 今天給大家詳細(xì)介紹一下Offstage的使用。

Offstage詳解

我們首先來(lái)看下Offstage的定義:

class Offstage extends SingleChildRenderObjectWidget

可以看到,Offstage是一個(gè)包含單個(gè)child的Widget。接下來(lái)看下它的構(gòu)造函數(shù):

  const Offstage({ Key? key, this.offstage = true, Widget? child })
    : assert(offstage != null),
      super(key: key, child: child);

Offstage主要包含兩個(gè)屬性,分別是表示是否是offstage狀態(tài)的bool值offstage,如果offstage=true,那么Offstage的子child就會(huì)處于隱藏狀態(tài)。這時(shí)候子child不會(huì)占用任何空間。

剩下的一個(gè)屬性就是child了。

那么Offstage是如何控制child是否offstage的呢?

我們看下它的createRenderObject方法:

RenderOffstage createRenderObject(BuildContext context) => RenderOffstage(offstage: offstage);

可以看到返回的是一個(gè)RenderOffstage對(duì)象,其中接受一個(gè)offstage參數(shù)。

如果深入研究RenderOffstage的話,可以看到他的paint方法是這樣的:

  void paint(PaintingContext context, Offset offset) {
    if (offstage)
      return;
    super.paint(context, offset);
  }

如果offstage是true的話,paint方法直接返回,不會(huì)進(jìn)行任何的繪制。這也就是Offstage的秘密。

Offstage的使用

從上面講解的Offstage的構(gòu)造函數(shù)我們知道,Offstage需要一個(gè)bool的offstage屬性。所以這個(gè)offstage屬性是可以變換的,從而觸發(fā)offstage的不同狀態(tài)。

因?yàn)閛ffstage需要這樣的一個(gè)狀態(tài),所以我們?cè)谑褂胦ffstage的時(shí)候,一般來(lái)說(shuō)是創(chuàng)建一個(gè)StatefulWidget,從而在StatefulWidget中保持這樣的一個(gè)offstage屬性。

比如我們創(chuàng)建一個(gè)OffstageApp,這是一個(gè)StatefulWidget,在它的createState方法中,返回一個(gè)State<OffstageApp>對(duì)象,在createState方法中,我們定義一個(gè)_offstage屬性。

通過(guò)使用這個(gè)_offstage,我們可以創(chuàng)建Offstage如下:

Offstage(
          offstage: _offstage,
          child: SizedBox(
            key: _key,
            width: 150.0,
            height: 150.0,
            child: Container(
              color: Colors.red,
            ),
          ),
        )

這里我們?cè)O(shè)置Offstage的offstage為剛剛設(shè)置的_offstage。

另外為了展示方便,我們將Offstage的child設(shè)置為一個(gè)SizedBox,里面包含了一個(gè)紅色的Container。

SizedBox包含了width和height屬性,方便我們后續(xù)的測(cè)試。

默認(rèn)情況下,因?yàn)開(kāi)offstage=true,所以這個(gè)Offstage是不可見(jiàn)的,那么怎么將其可見(jiàn)呢?

我們提供一個(gè)ElevatedButton,在它的onPressed方法中,我們調(diào)用setState方法來(lái)修改_offstage,如下所示:

ElevatedButton(
          child: const Text('切換offstage'),
          onPressed: () {
            setState(() {
              _offstage = !_offstage;
            });
          },
        ),

另外,我們還需要一個(gè)ElevatedButton來(lái)檢測(cè)Offstage的大小,看看在_offstage發(fā)生變化的時(shí)候,Offstage到底會(huì)不會(huì)發(fā)生變化。

 ElevatedButton(
              child: const Text('檢測(cè)SizedBox大小'),
              onPressed: () {
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content:
                    Text('SizedBox is ${_getSizedBoxSize()}'),
                  ),
                );
              })

這里的_getSizedBoxSize實(shí)現(xiàn)如下:

  Size _getSizedBoxSize() {
    final RenderBox renderBox =
    _key.currentContext!.findRenderObject()! as RenderBox;
    return renderBox.size;
  }

我們通過(guò)Offstage的_key,來(lái)獲取到它的Context,從而找到對(duì)應(yīng)的RenderBox,拿到它的大小。

好了,這樣我們的代碼就寫好了,最后將OffstageApp放到Scaffold中運(yùn)行,我們可以得到下面的界面:

默認(rèn)Offstage是不會(huì)展示的。

如果我們點(diǎn)擊下面的檢測(cè)SizeBox大小的按鈕,可以得到下面的界面:

可以看到雖然Offstage沒(méi)有展示,但是還是獲取到了它的大小。

然后我們點(diǎn)擊切換Offstage按鈕,可以得到下面的界面:

界面完美的展示了。

總結(jié)

Offstage是一個(gè)非常方便的組件,可以用來(lái)隱藏我們不需要展示的組件,但是仍然可以獲得它的大小。

到此這篇關(guān)于Android Flutter中Offstage組件的使用教程詳解的文章就介紹到這了,更多相關(guān)Android Flutter Offstage內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android實(shí)現(xiàn)九宮格拼圖游戲

    Android實(shí)現(xiàn)九宮格拼圖游戲

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)九宮格拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Android?studio實(shí)現(xiàn)動(dòng)態(tài)背景頁(yè)面

    Android?studio實(shí)現(xiàn)動(dòng)態(tài)背景頁(yè)面

    這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)動(dòng)態(tài)背景頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android 代碼設(shè)置開(kāi)機(jī)自啟動(dòng)App的方法

    Android 代碼設(shè)置開(kāi)機(jī)自啟動(dòng)App的方法

    今天小編就為大家分享一篇Android 代碼設(shè)置開(kāi)機(jī)自啟動(dòng)App的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Flutter 自定義Drawer 滑出位置的大小實(shí)例代碼詳解

    Flutter 自定義Drawer 滑出位置的大小實(shí)例代碼詳解

    這篇文章主要介紹了Flutter 自定義Drawer 滑出位置的大小,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Retrofit自定義請(qǐng)求參數(shù)注解的實(shí)現(xiàn)思路

    Retrofit自定義請(qǐng)求參數(shù)注解的實(shí)現(xiàn)思路

    這篇文章主要給大家介紹了Retrofit自定義請(qǐng)求參數(shù)注解的實(shí)現(xiàn)思路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Android隱藏頂部狀態(tài)欄所遇到的問(wèn)題

    Android隱藏頂部狀態(tài)欄所遇到的問(wèn)題

    本文給大家分享兩種隱藏狀態(tài)欄的方法及在實(shí)現(xiàn)的過(guò)程中遇到的坑,下面在本文中給大家做個(gè)總結(jié),希望對(duì)大家學(xué)習(xí)android頂部狀態(tài)欄知識(shí)有所幫助
    2016-11-11
  • Android編程雙重單選對(duì)話框布局實(shí)現(xiàn)與事件監(jiān)聽(tīng)方法示例

    Android編程雙重單選對(duì)話框布局實(shí)現(xiàn)與事件監(jiān)聽(tīng)方法示例

    這篇文章主要介紹了Android編程雙重單選對(duì)話框布局實(shí)現(xiàn)與事件監(jiān)聽(tīng)方法,涉及Android雙重單選對(duì)話框的界面布局與事件監(jiān)聽(tīng)、響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android廣播機(jī)制原理與開(kāi)發(fā)

    Android廣播機(jī)制原理與開(kāi)發(fā)

    Android廣播機(jī)制就是在Android中,有一些操作完成以后,會(huì)發(fā)送廣播,比如說(shuō)發(fā)出一條短信,或打出一個(gè)電話,如果某個(gè)程序接收了這個(gè)廣播,就會(huì)做相應(yīng)的處理
    2023-02-02
  • Android自定義控件如何在XML文件中使用自定義屬性

    Android自定義控件如何在XML文件中使用自定義屬性

    這篇文章主要為大家介紹了Android自定義控件之如何在XML文件中使用自定義屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Android使用Retrofit2.0技術(shù)仿微信發(fā)說(shuō)說(shuō)

    Android使用Retrofit2.0技術(shù)仿微信發(fā)說(shuō)說(shuō)

    這篇文章主要為大家詳細(xì)介紹了Android使用Retrofit2.0技術(shù)仿微信發(fā)說(shuō)說(shuō),實(shí)現(xiàn)拍照,選圖庫(kù),多圖案上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論