flutter 層疊布局Stack烘跺、Positioned

層疊布局

層疊布局和Web中的絕對定位、Android中的Frame布局是相似的葵陵,子widget可以根據(jù)到父容器四個角的位置來確定本身的位置液荸。絕對定位允許子widget堆疊(按照代碼中聲明的順序)。Flutter中使用Stack和Positioned來實現(xiàn)絕對定位脱篙,Stack允許子widget堆疊娇钱,而Positioned可以給子widget定位(根據(jù)Stack的四個角)。

Stack
Stack({
  this.alignment = AlignmentDirectional.topStart,
  this.textDirection,
  this.fit = StackFit.loose,
  this.overflow = Overflow.clip,
  List<Widget> children = const <Widget>[],
})
  • alignment:此參數(shù)決定如何去對齊沒有定位(沒有使用Positioned)或部分定位的子widget绊困。所謂部分定位文搂,在這里特指沒有在某一個軸上定位:left、right為橫軸秤朗,top煤蹭、bottom為縱軸,只要包含某個軸上的一個定位屬性就算在該軸上有定位取视。
  • textDirection:和Row硝皂、Wrap的textDirection功能一樣,都用于決定alignment對齊的參考系即:textDirection的值為TextDirection.ltr作谭,則alignment的start代表左稽物,end代表右;textDirection的值為TextDirection.rtl折欠,則alignment的start代表右贝或,end代表左。
  • fit:此參數(shù)用于決定沒有定位的子widget如何去適應Stack的大小锐秦。StackFit.loose表示使用子widget的大小咪奖,StackFit.expand表示擴伸到Stack的大小。
  • overflow:此屬性決定如何顯示超出Stack顯示空間的子widget酱床,值為Overflow.clip時羊赵,超出部分會被剪裁(隱藏),值為Overflow.visible 時則不會扇谣。
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用于指定定位元素的寬度和高度,注意楞慈,此處的width幔烛、height 和其它地方的意義稍微有點區(qū)別,此處用于配合left囊蓝、top 饿悬、right、 bottom來定位widget聚霜,舉個例子狡恬,在水平方向時,你只能指定left蝎宇、right弟劲、width三個屬性中的兩個,如指定left和width后姥芥,right會自動算出(left+width)兔乞,如果同時指定三個屬性則會報錯,垂直方向同理凉唐。

示例
class _home extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _homeState();
  }
}
class _homeState extends State<_home>{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("title"),
        centerTitle: true,
      ),
      body: //通過ConstrainedBox來確保Stack占滿屏幕
      ConstrainedBox(
        constraints: BoxConstraints.expand(),
        child: Stack(
          alignment:Alignment.center , //指定未定位或部分定位widget的對齊方式
          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"),
            )
          ],
        ),
      )
    );
  }
}

由于第一個子widget Text("Hello world")沒有指定定位庸追,并且alignment值為Alignment.center,所以台囱,它會居中顯示淡溯。第二個子widget Text("I am Jack")只指定了水平方向的定位(left),所以屬于部分定位玄坦,即垂直方向上沒有定位血筑,那么它在垂直方向?qū)R方式則會按照alignment指定的對齊方式對齊,即垂直方向居中煎楣。對于第三個子widget Text("Your friend")豺总,和第二個Text原理一樣,只不過是水平方向沒有定位择懂,則水平方向居中喻喳。
我們給上例中的Stack指定一個fit屬性,然后將三個子widget的順序調(diào)整一下:

class _home extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _homeState();
  }
}
class _homeState extends State<_home>{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("title"),
        centerTitle: true,
      ),
      body: //通過ConstrainedBox來確保Stack占滿屏幕
      Stack(
        alignment:Alignment.center ,
        fit: StackFit.expand, //未定位widget占滿Stack整個空間
        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"),
          )
        ],
      ),
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末困曙,一起剝皮案震驚了整個濱河市表伦,隨后出現(xiàn)的幾起案子谦去,更是在濱河造成了極大的恐慌,老刑警劉巖蹦哼,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳄哭,死亡現(xiàn)場離奇詭異,居然都是意外死亡纲熏,警方通過查閱死者的電腦和手機妆丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來局劲,“玉大人勺拣,你說我怎么就攤上這事∮闾睿” “怎么了药有?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苹丸。 經(jīng)常有香客問我愤惰,道長,這世上最難降的妖魔是什么赘理? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任羊苟,我火速辦了婚禮,結(jié)果婚禮上感憾,老公的妹妹穿的比我還像新娘蜡励。我一直安慰自己,他們只是感情好阻桅,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布凉倚。 她就那樣靜靜地躺著,像睡著了一般嫂沉。 火紅的嫁衣襯著肌膚如雪稽寒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天趟章,我揣著相機與錄音杏糙,去河邊找鬼。 笑死蚓土,一個胖子當著我的面吹牛宏侍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜀漆,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼谅河,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绷耍,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤吐限,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后褂始,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诸典,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年崎苗,在試婚紗的時候發(fā)現(xiàn)自己被綠了搂赋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡益缠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出基公,到底是詐尸還是另有隱情幅慌,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布轰豆,位于F島的核電站胰伍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酸休。R本人自食惡果不足惜骂租,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斑司。 院中可真熱鬧渗饮,春花似錦、人聲如沸宿刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僵缺。三九已至胡桃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磕潮,已是汗流浹背翠胰。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留自脯,地道東北人之景。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像膏潮,于是被迫代替她去往敵國和親闺兢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 本文的目的是為了讓讀者掌握不同布局類Widget的布局特點,分享一些在實際使用過程遇到的一些問題屋谭,在《Flu...
    xqqlv閱讀 5,249評論 0 18
  • 原文在此脚囊,這里只為學習層疊布局和Web中的絕對定位、Android中的Frame布局是相似的桐磁,子widget可以根...
    lltree閱讀 1,000評論 0 0
  • 我是層疊布局 的搬運工Flutter 布局(八)- Stack悔耘、IndexedStack、GridView詳解 S...
    LiYaoPeng閱讀 21,455評論 0 5
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案我擂? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,737評論 1 92
  • 雅子來到約定好的咖啡廳衬以,在門口被人攔住,是一個穿著黑色西服的男子校摩,“請問是雅子小姐嗎看峻?”雅子點頭,“是的衙吩,跟張先生...
    琳火火是個大齡女青年閱讀 296評論 0 1