層疊布局 Stack丝里、Positioned

層疊布局和Web中的絕對(duì)定位曲初、Android中的Frame布局是相似的,子組件可以根據(jù)距父容器四個(gè)角的位置來(lái)確定自身的位置杯聚。絕對(duì)定位允許子組件堆疊起來(lái)(按照代碼中聲明的順序)臼婆。Flutter中使用Stack和Positioned這兩個(gè)組件來(lái)配合實(shí)現(xiàn)絕對(duì)定位。Stack允許子組件堆疊幌绍,而Positioned用于根據(jù)Stack的四個(gè)角來(lái)確定子組件的位置颁褂。

Stack
Stack({
this.alignment = AlignmentDirectional.topStart,
this.textDirection,
this.fit = StackFit.loose,
this.overflow = Overflow.clip,
List<Widget> children = const <Widget>[],
})
alignment:此參數(shù)決定如何去對(duì)齊沒(méi)有定位(沒(méi)有使用Positioned)或部分定位的子組件。所謂部分定位傀广,在這里特指沒(méi)有在某一個(gè)軸上定位:left颁独、right為橫軸,top伪冰、bottom為縱軸誓酒,只要包含某個(gè)軸上的一個(gè)定位屬性就算在該軸上有定位。
textDirection:和Row贮聂、Wrap的textDirection功能一樣靠柑,都用于確定alignment對(duì)齊的參考系,即:textDirection的值為TextDirection.ltr吓懈,則alignment的start代表左歼冰,end代表右,即從左往右的順序骄瓣;textDirection的值為TextDirection.rtl停巷,則alignment的start代表右,end代表左榕栏,即從右往左的順序畔勤。
fit:此參數(shù)用于確定沒(méi)有定位的子組件如何去適應(yīng)Stack的大小。StackFit.loose表示使用子組件的大小扒磁,StackFit.expand表示擴(kuò)伸到Stack的大小庆揪。
overflow:此屬性決定如何顯示超出Stack顯示空間的子組件;值為Overflow.clip時(shí)妨托,超出部分會(huì)被剪裁(隱藏)缸榛,值為Overflow.visible 時(shí)則不會(huì)。
Positioned
const Positioned({
Key key,
this.left,
this.top,
this.right,
this.bottom,
this.width,
this.height,
@required Widget child,
})
left兰伤、top 内颗、right、 bottom分別代表離Stack左敦腔、上均澳、右、底四邊的距離。width和height用于指定需要定位元素的寬度和高度找前。注意糟袁,Positioned的width、height 和其它地方的意義稍微有點(diǎn)區(qū)別躺盛,此處用于配合left项戴、top 、right槽惫、 bottom來(lái)定位組件周叮,舉個(gè)例子,在水平方向時(shí)界斜,你只能指定left则吟、right、width三個(gè)屬性中的兩個(gè)锄蹂,如指定left和width后,right會(huì)自動(dòng)算出(left+width)水慨,如果同時(shí)指定三個(gè)屬性則會(huì)報(bào)錯(cuò)得糜,垂直方向同理。

示例

在下面的例子中晰洒,我們通過(guò)對(duì)幾個(gè)Text組件的定位來(lái)演示StackPositioned的特性:

//通過(guò)ConstrainedBox來(lái)確保Stack占滿屏幕
ConstrainedBox(
  constraints: BoxConstraints.expand(),
  child: Stack(
    alignment:Alignment.center , //指定未定位或部分定位widget的對(duì)齊方式
    children: <Widget>[
      Container(child: Text("Hello world",style: TextStyle(color: Colors.white)),
        color: Colors.red,
      ),
      Positioned(
        left: 18.0,
        child: Text("I am Jack"),
      ),
      Positioned(
        top: 18.0,
        child: Text("Your friend"),
      )        
    ],
  ),
);

運(yùn)行效果見(jiàn)圖4-9:

圖4-9

由于第一個(gè)子文本組件Text("Hello world")沒(méi)有指定定位朝抖,并且alignment值為Alignment.center,所以它會(huì)居中顯示谍珊。第二個(gè)子文本組件Text("I am Jack")只指定了水平方向的定位(left)治宣,所以屬于部分定位,即垂直方向上沒(méi)有定位砌滞,那么它在垂直方向的對(duì)齊方式則會(huì)按照alignment指定的對(duì)齊方式對(duì)齊侮邀,即垂直方向居中。對(duì)于第三個(gè)子文本組件Text("Your friend")贝润,和第二個(gè)Text原理一樣绊茧,只不過(guò)是水平方向沒(méi)有定位,則水平方向居中打掘。

我們給上例中的Stack指定一個(gè)fit屬性华畏,然后將三個(gè)子文本組件的順序調(diào)整一下:

Stack(
  alignment:Alignment.center ,
  fit: StackFit.expand, //未定位widget占滿Stack整個(gè)空間
  children: <Widget>[
    Positioned(
      left: 18.0,
      child: Text("I am Jack"),
    ),
    Container(child: Text("Hello world",style: TextStyle(color: Colors.white)),
      color: Colors.red,
    ),
    Positioned(
      top: 18.0,
      child: Text("Your friend"),
    )
  ],
),

顯示效果如圖4-10所示:

圖4-10

可以看到,由于第二個(gè)子文本組件沒(méi)有定位尊蚁,所以fit屬性會(huì)對(duì)它起作用亡笑,就會(huì)占滿Stack。由于Stack子元素是堆疊的横朋,所以第一個(gè)子文本組件被第二個(gè)遮住了仑乌,而第三個(gè)在最上層,所以可以正常顯示。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绝骚,一起剝皮案震驚了整個(gè)濱河市耐版,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌压汪,老刑警劉巖粪牲,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異止剖,居然都是意外死亡腺阳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門穿香,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亭引,“玉大人,你說(shuō)我怎么就攤上這事皮获”候荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵洒宝,是天一觀的道長(zhǎng)购公。 經(jīng)常有香客問(wèn)我,道長(zhǎng)雁歌,這世上最難降的妖魔是什么宏浩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮靠瞎,結(jié)果婚禮上比庄,老公的妹妹穿的比我還像新娘。我一直安慰自己乏盐,他們只是感情好佳窑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著父能,像睡著了一般华嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上法竞,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天耙厚,我揣著相機(jī)與錄音,去河邊找鬼岔霸。 笑死薛躬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呆细。 我是一名探鬼主播型宝,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼八匠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了趴酣?” 一聲冷哼從身側(cè)響起梨树,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岖寞,沒(méi)想到半個(gè)月后抡四,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仗谆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年指巡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隶垮。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡藻雪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狸吞,到底是詐尸還是另有隱情勉耀,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布蹋偏,位于F島的核電站瑰排,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏暖侨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一崇渗、第九天 我趴在偏房一處隱蔽的房頂上張望字逗。 院中可真熱鬧,春花似錦宅广、人聲如沸葫掉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俭厚。三九已至,卻和暖如春驶臊,著一層夾襖步出監(jiān)牢的瞬間挪挤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工关翎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛门,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓纵寝,卻偏偏與公主長(zhǎng)得像论寨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348