Flutter布局全解

由上面的架構(gòu)圖可以看出來,flutter最上層是google 的紙墨設(shè)計(jì)Material Design(MaterialApp)組件芭届,關(guān)于Material Design設(shè)計(jì)理念大家可以去官網(wǎng)安利一下啊material.io

在MaterialApp下面是所有組件的基類Widget蛔钙,而在Widget的上層是statelessWdiget(無(wú)狀態(tài)組件)锌云、statefulWidget(有狀態(tài)組件)和InheritedWidget(可以向子類View樹種傳遞信息),包括我們?cè)谏掀恼轮杏玫降腟caffold吁脱、Center桑涎、Text都是statelessWdiget、statefulWidget的子類兼贡。

開始之前攻冷,我們需要知道一些名詞的含義和作用,在這里不懂的也沒有關(guān)系遍希,逐漸往后面看等曼,往后面使用后,會(huì)有越來越清晰的理解孵班。

  • MaterialApp

是我們app開發(fā)中常用的符合MaterialApp Design設(shè)計(jì)理念的入口Widget涉兽。

  • StatelessWidget

StatelessWidget是非動(dòng)態(tài)的,它不依賴于除了傳入數(shù)據(jù)以外的任何其他數(shù)據(jù)篙程,這意味著改變其顯示的唯一方式枷畏,就是改變傳入其構(gòu)造函數(shù)的參數(shù)。比如Text虱饿,Button拥诡,Icon這些控件。

  • StatefulWidget

StatefulWidget是動(dòng)態(tài)的氮发,他們?cè)试S我們創(chuàng)建一個(gè)能動(dòng)隨時(shí)間改變內(nèi)容的widget渴肉,并且不依賴于其初始化時(shí)被傳入的靜態(tài)狀態(tài),可以隨著用戶的輸入爽冕,各種形式的異步回包或其他形式的狀態(tài)變化而變化仇祭。比如Image,CheckBox颈畸,F(xiàn)orm這些控件乌奇。

  • Scaffold

Scaffold 翻譯過來就是腳手架的意思没讲,它實(shí)現(xiàn)了基本的 Material Design 可視化布局結(jié)構(gòu)。簡(jiǎn)單的說礁苗,Scaffold就是一個(gè)提供 Material Design 設(shè)計(jì)中基本布局的 widget爬凑。

const Scaffold({
  Key key,
  this.appBar, // 標(biāo)題欄
  this.body,  // 用于顯示當(dāng)前界面主要內(nèi)容的Widget
  this.floatingActionButton, // 一個(gè)懸浮在body上的按鈕,默認(rèn)顯示在右下角
  this.floatingActionButtonLocation, // 用于設(shè)置floatingActionButton顯示的位置
  this.floatingActionButtonAnimator, // floatingActionButton移動(dòng)到一個(gè)新的位置時(shí)的動(dòng)畫
  this.persistentFooterButtons, // 多狀態(tài)按鈕
  this.drawer, // 左側(cè)的抽屜菜單
  this.endDrawer, //  右'側(cè)的抽屜菜單
  this.bottomNavigationBar,// 底部導(dǎo)航欄试伙。
  this.bottomSheet, // 顯示在底部的工具欄
  this.backgroundColor,// 內(nèi)容的背景顏色
  this.resizeToAvoidBottomPadding = true, // 控制界面內(nèi)容 body 是否重新布局來避免底部被覆蓋嘁信,比如當(dāng)鍵盤顯示的時(shí)候,重新布局避免被鍵盤蓋住內(nèi)容疏叨。
  this.primary = true,// Scaffold是否顯示在頁(yè)面的頂部
}) 

一個(gè) MaterialApp 由多個(gè) Scalfold 頁(yè)面組成潘靖,每個(gè) Scalfold 的主要結(jié)構(gòu)如下:
AppBar:頂部導(dǎo)航欄
body:中間內(nèi)容體
BottomNavigationBar:底部導(dǎo)航欄

  • Container

它是一個(gè)結(jié)合了繪制(painting)、定位(positioning)以及尺寸(sizing)widget的widget考廉。

Container({
    Key key,
    this.alignment,
    this.padding,
    Color color,
    Decoration decoration,
    this.foregroundDecoration,
    double width,
    double height,
    BoxConstraints constraints,
    this.margin,
    this.transform,
    this.child,
  })

alignment:控制child的對(duì)齊方式
decoration:繪制在child后面的裝飾

  • padding/margin

控件加入內(nèi)/外邊距秘豹。屬性如下:

EdgeInsets.all(12),// 指定四個(gè)方向相同的值
EdgeInsets.fromLTRB(10, 20, 30, 40),// 分別指定四個(gè)方向的值
EdgeInsets.only(left: 10,right: 30),// 指定任意個(gè)方向的值EdgeInsets.symmetric(vertical: 10,horizontal: 50),//指定水平(left right)或垂直方向(top,bottom)的值昌粤。

  • 線性布局Row既绕、Column

Row和Column分別是Flutter中的水平和垂直布局,對(duì)應(yīng)Android里面的LinearLayout的水平垂直方向布局涮坐。

MainAxisAlignment (主軸)屬性:

enum MainAxisAlignment {
//將子控件放在主軸的開始位置
start,
//將子控件放在主軸的結(jié)束位置
end,
//將子控件放在主軸的中間位置
center,
//將主軸空白位置進(jìn)行均分凄贩,排列子元素,手尾沒有空隙
spaceBetween,
//將主軸空白區(qū)域均分袱讹,使中間各個(gè)子控件間距相等疲扎,首尾子控件間距為中間子控件間距的一半
spaceAround,
//將主軸空白區(qū)域均分,使各個(gè)子控件間距相等
spaceEvenly,
}

CrossAxisAlignment(交叉軸)屬性:

enum CrossAxisAlignment {
//將子控件放在交叉軸的起始位置
start,
//將子控件放在交叉軸的結(jié)束位置
end,
//將子控件放在交叉軸的中間位置
center,
//使子控件填滿交叉軸
stretch,
//將子控件放在交叉軸的上捷雕,并且與基線相匹配(不常用)
baseline,
}

配合Expanded使用椒丧,使Expanded中的child充滿空白區(qū)域。Expanded組件必須用在Row救巷、Column壶熏、Flex內(nèi)。

Expanded(  
          flex: 1,
          child: Text(""),
        )

屬性:

crossAxisAlignment:交叉軸子組件對(duì)齊方式
mainAxisAlignment:主軸子組件排列方式
mainAxisSize:Main 軸大小浦译,相當(dāng)于match_parent,wrap_content
verticalDirection:從下向上或從上向下擺放子組件

效果:


  • 相對(duì)布局Stack

Stack 這個(gè)是Flutter中布局用到的組件棒假,跟Android中FrameLayout或RelativeLayout很像。是一個(gè)在布局中使用相當(dāng)頻繁的布局組件精盅,相當(dāng)重要的一個(gè)布局帽哑,這里當(dāng)然要著重講解。

Stack({
  Key key,
  this.alignment = AlignmentDirectional.topStart,
  this.textDirection,
  this.fit = StackFit.loose,
  this.overflow = Overflow.clip,
  List<Widget> children = const <Widget>[],
})
  • alignment : 指的是子Widget的對(duì)其方式叹俏,子view從哪個(gè)方位開始對(duì)齊
  • fit :用來決定沒有Positioned方式時(shí)候子Widget的大小妻枕,StackFit.loose 指的是子Widget 多大就多大,StackFit.expand使子Widget的大小和父組件一樣大
  • overflow :指子Widget 超出Stack時(shí)候如何顯示,默認(rèn)值是Overflow.clip佳头,子Widget超出Stack會(huì)被截?cái)嘤ス螅琌verflow.visible超出部分還會(huì)顯示的
  • Positioned:
    這個(gè)使用控制Widget的位置晴氨,通過他可以隨意擺放一個(gè)組件康嘉,有點(diǎn)像絕對(duì)布局
Positioned({
  Key key,
  this.left,
  this.top,
  this.right,
  this.bottom,
  this.width,
  this.height,
  @required Widget child,
})
  • 配合Align使用,可以單獨(dú)設(shè)置子Widget的布局方位籽前。
    Stack(
        children: [
           Align(
               alignment: Alignment.centerLeft,
               child: Text("你創(chuàng)作的亭珍,就是頭條", style: TextStyle(fontSize: 15))
         )
    ]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枝哄,隨后出現(xiàn)的幾起案子肄梨,更是在濱河造成了極大的恐慌,老刑警劉巖挠锥,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众羡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蓖租,警方通過查閱死者的電腦和手機(jī)粱侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖宦,“玉大人齐婴,你說我怎么就攤上這事〕砻” “怎么了柠偶?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)睬关。 經(jīng)常有香客問我诱担,道長(zhǎng),這世上最難降的妖魔是什么电爹? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任蔫仙,我火速辦了婚禮,結(jié)果婚禮上藐不,老公的妹妹穿的比我還像新娘匀哄。我一直安慰自己,他們只是感情好雏蛮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布涎嚼。 她就那樣靜靜地躺著,像睡著了一般挑秉。 火紅的嫁衣襯著肌膚如雪法梯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音立哑,去河邊找鬼夜惭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铛绰,可吹牛的內(nèi)容都是我干的诈茧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼捂掰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼敢会!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起这嚣,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸥昏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姐帚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吏垮,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年罐旗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膳汪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尤莺,死狀恐怖旅敷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颤霎,我是刑警寧澤媳谁,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站友酱,受9級(jí)特大地震影響晴音,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缔杉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一锤躁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧或详,春花似錦系羞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梧乘,卻和暖如春澎迎,著一層夾襖步出監(jiān)牢的瞬間庐杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工夹供, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灵份,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓哮洽,卻偏偏與公主長(zhǎng)得像填渠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袁铐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350