Android?Flutter中Offstage組件的使用教程詳解
簡(jiǎn)介
我們?cè)谑褂胒lutter的過(guò)程中,有時(shí)候需要控制某些組件是否展示,一種方法是將這個(gè)組件從render tree中刪除,這樣這個(gè)組件就相當(dāng)于沒(méi)有出現(xiàn)一樣,但是有時(shí)候,我們只是不想展示這個(gè)widget,但是這個(gè)組件還是存在的,并且可以接受鍵盤(pán)輸入,還可以使用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,拿到它的大小。
好了,這樣我們的代碼就寫(xiě)好了,最后將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)文章
Kotlin對(duì)象的懶加載方式by?lazy?與?lateinit?異同詳解
這篇文章主要為大家介紹了Kotlin對(duì)象的懶加載方式by?lazy?與?lateinit?異同詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android透明化和沉浸式狀態(tài)欄實(shí)踐及源碼分析
這篇文章主要介紹了Android透明化和沉浸式狀態(tài)欄實(shí)踐及源碼分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
android開(kāi)發(fā)教程之實(shí)現(xiàn)toast工具類(lèi)
這篇文章主要介紹了android開(kāi)發(fā)中需要的toast工具類(lèi),需要的朋友可以參考下2014-05-05
Android 側(cè)邊滑動(dòng)關(guān)閉Activity的示例代碼
這篇文章主要介紹了Android 側(cè)邊滑動(dòng)關(guān)閉Activity的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Android 7.0 手電筒控制實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android 7.0 手電筒控制實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
Android開(kāi)發(fā)之基于RecycleView實(shí)現(xiàn)的頭部懸浮控件
RecyclerView是一種類(lèi)似于ListView的一個(gè)滑動(dòng)列表,但是RecyclerView和ListView相比,RecyclerView比ListView更好,這篇文章重點(diǎn)給大家介紹基于RecycleView實(shí)現(xiàn)的頭部懸浮控件,感興趣的朋友一起看看吧2019-10-10
android 手機(jī)截取長(zhǎng)屏實(shí)例代碼
本篇文章主要介紹了android 手機(jī)截取長(zhǎng)屏實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包
這篇文章主要介紹了Android Studio使用教程(五):Gradle命令詳解和導(dǎo)入第三方包,本文講解了導(dǎo)入Android Studio、Gradle常用命令等內(nèi)容,需要的朋友可以參考下2015-05-05
Android高仿QQ6.0側(cè)滑刪除實(shí)例代碼
先給大家分享一下,側(cè)滑刪除,布局也就是前面一個(gè)item,然后有兩個(gè)隱藏的按鈕(TextView也可以),然后我們可以向左側(cè)滑動(dòng),然后顯示出來(lái),然后對(duì)delete(刪除鍵)實(shí)現(xiàn)監(jiān)聽(tīng),就可以了哈。好了那就來(lái)看看代碼怎么實(shí)現(xiàn)的吧2016-02-02

