3.flutter開發(fā)基礎-Widget組件

1.Widge組件分類

在flutter中入宦,所有UI元素都是widget組件蛙埂,除了我們常見的button帅腌,Image這些可見元素驰弄,布局也是組件,甚至文本格式控制也是組件速客。這里我們先簡單講解一下我們通常概念的上的UI控件戚篙。在flutter中組件有兩種:有狀態(tài)組件和無狀態(tài)組件。

  • 無狀態(tài)組件(stateless widget)溺职,無狀態(tài)組件不提供可變狀態(tài)維護岔擂,無狀態(tài)組件僅根據(jù)其屬性來渲染位喂,
  • 有狀態(tài)組件(stateful Widget),組件自己維護狀態(tài),組件渲染由SetState方法調用乱灵,更具state的變化差異來更新渲染塑崖。所有的stateful widget都是建立在stateless widget上的。
    這里我們先講解stateless widget, flutter中的stateless widget主要分為這幾類:
  • Visual Base Elemet, 可視基礎元素比如:Text痛倚,Image, Icon
  • Layout: 布局元素规婆,flutter比較特別一點,它把布局也作為頁面元素蝉稳,這樣做的主要目的是可以簡化布局計算抒蚜。以前UI做Layout通常通過Layout引擎根據(jù)預定的約束來進行計算, 計算過程實際上是做多元方程式求解,元素越多求解計算就越慢耘戚,參考:從 Auto Layout 的布局算法談性能
    嗡髓。而flutter將layout也作為頁面元素,使得布局在局部范圍就可以求解毕莱。Layout元素有:Row器贩,Column,Center朋截,Align蛹稍,Padding等
  • Painting and Effect Widgets& Animation and Motion
    ,繪制和效果組件部服。繪制和效果組件主要是負責可視元素的裝飾效果唆姐,比如實現(xiàn)邊框(DecoratedBox),實現(xiàn)半透明(Opacity),位移旋轉變換(Transform)廓八,Animation and Motion是比較特殊的效果組件奉芦,用于實現(xiàn)動畫效果
  • Container&compound element 大多數(shù)我們常用的各種控件都是由基礎元素和布局組合而成的,比如button由Text剧蹂,Image声功,DecoratedBox等元素組成
  • Interaction Model Widgets, 這個是專門處理事件響應的組件,用于響應用戶的操作

2.讓我們來創(chuàng)建Hello World

首先我們先來寫一個最基本的flutter應用吧宠叼。

1.在適當?shù)哪夸泩?zhí)行:

flutter init -o my_hello_world_app

2.替換my_hello_world_app/lib/main.dart文件中的內容:

import 'package:flutter/material.dart';
void main() => runApp(new Center(child: new Text('Hello, world!')));

3.在my_hello_world_app目錄下執(zhí)行:

flutter start

4.你將會在手機上看到:


這里寫圖片描述

如果你能一切順利的來到這里先巴,那么恭喜你,你已經(jīng)成功使用flutter開發(fā)了一個android的應用冒冬,雖然這個應用看上去比較單一伸蚯。

main方法是這個應用的入口,要運行一個應用的話需要使用runApp方法简烤,它接收一個Widget控件作為參數(shù)剂邮,并且把這個控件作為控件樹的根節(jié)點。在我們這個例子里横侦,控件樹里有兩個控件挥萌,Center控件和它的子節(jié)點Text绰姻。通常情況下框架會強制將根控件充滿整個屏幕,所以相對的Text控件就以屏幕為中心了瑞眼。

重要概念:
在編寫flutter應用的時候龙宏,通常情況下需要自定義組件棵逊,這些組件繼承自StatelessComponentStatefulComponent,選擇要繼承哪一個取決于這個組件是否需要管理狀態(tài)和配置伤疙。一個組件的主要工作就是實現(xiàn)build方法,這個方法用來反應該組件在其他組件中的表現(xiàn)形式辆影。最后底層框架會統(tǒng)一從上到下調用build方法直至渲染樹的最底層徒像。

基本控件

flutter提供了一套完備的基本控件,最常用的有如下幾個:

  • Text :Text提供了一個用來顯示文本的一次性控件(即無狀態(tài))蛙讥。
  • Row, Column:這兩個控件用來顯示水平或垂直方向上的多個組件锯蛀,并且是可伸縮的。
  • Stack:可以將多個組件以一定的順序排列次慢,可以使用Positioned控件來指定組件在Stack中的順序旁涤。
  • Container: 是一個可視化的矩形控件,它可以使用BoxDecoration來進行外觀裝飾迫像,裝飾內容可以是背景劈愚,邊框和陰影等。Container也有外邊距闻妓,內邊距等屬性菌羽,也可以約束自身的大小,另外值得一提的是Container還可以利用矩陣在三維控件內做轉換由缆。

下面結合一些基本的控件來自定義我們的組件并構建應用:
修改main.dart代碼如下

import 'package:flutter/material.dart';

class MyToolBar extends StatelessComponent { //(3)
  MyToolBar({ this.title });

  final Widget title; //(6)

  Widget build(BuildContext context) {
    return new Container(
      height: 56.0,
      padding: const EdgeDims.symmetric(horizontal: 8.0),
      decoration: new BoxDecoration(
        backgroundColor: Colors.blue[500]
      ),
      child: new Row([
        new IconButton(icon: 'navigation/menu'),
        new Flexible(child: title),
        new IconButton(icon: 'action/search'),
      ])
    );
  }
}

class MyScaffold extends StatelessComponent { //(4)
  Widget build(BuildContext context) {
    return new Material(
      child: new Column([
        new MyToolBar(
          title: new Text('Example title', style: Typography.white.title)
        ),
        new Flexible(
          child: new Center(
            child: new Text('Hello, world!')
          )
        )
      ])
    );
  }
}

void main() {
  runApp(new MaterialApp( //(1)
    title: 'My app',
    routes: <String, RouteBuilder>{ //(2)
      '/': (RouteArguments args) => new MyScaffold() //(5)
    }
  ));
}

同時確保flutter.yaml文件內容如下:

name: my_app
material-design-icons:
  - name: action/search
  - name: navigation/menu

我們先來運行一下這個應用:


這里寫圖片描述

恭喜你注祖,順利存活。
代碼解釋如下:

  • (1)處的MaterialApp是整個應用的主題控件均唉,一般我們自定義的組件要寫在它里面才會有Material的主題風格
  • (2)處的routes的作用是頁面導航作用是晨,/表示應用打開的第一個頁面。
  • (3)處的MyToolBar是我們自定義的一個無狀態(tài)組件舔箭,通過build方法罩缴,我們可以看出其最外層是一個Container控件,控件高為56dp,左右內邊距8dp限嫌,它由一個BoxDecoration做修飾靴庆,修飾內容是將背景顏色改為Colors.blue[500]這種顏色。Container的內部是一個Row怒医,Row的兩端分別是一個圖標按鈕炉抒,中間是另一個控件Flexible,它的作用是填充掉Row的剩余部分稚叹。在Flexible中傳入的是title這個內部字段焰薄。
  • (4)處的MyScaffold組件將其子節(jié)點用垂直的方式組織起來拿诸,在Column的第一個位置是我們自定義的MyToolBar,在構造MyToolBar的時候將一個Text控件作為它的命名可選參數(shù)title的值傳遞進去塞茅。在Column的第二個位置是一個Flexible用來填充剩余的空間亩码,在Flexible里面放置了一個Center組件,Center組件里則是一個Text用來顯示“Hello野瘦,World”描沟。
  • (5)處表示這個應用的第一個見面就是MyScaffold

這種flutter這種層層包裹的感覺就是前面提到的組件外構建UI一小部分含義鞭光,眼尖的同學可能已經(jīng)看到(6)處的title使用的是final修飾符吏廉,這里要說明一下繼承自StatelessComponent的組件,如內部有配置惰许,屬性或狀態(tài)的統(tǒng)一需要使用final修飾符席覆,表示這個組件本身自己是無狀態(tài)的,需要依賴它外部的其他組件汹买。這也是'組件外構建UI'最重要的含義所在佩伤。

Material應用

上面那個應用我們使用自己的組件進行應用開發(fā),發(fā)現(xiàn)應用整體美觀度不高晦毙。是因為flutter中應用界面會撐滿整個屏幕生巡,所以有一部分內容可能會被狀態(tài)欄擋住。其實flutter提供了一系列的控件供開發(fā)人員開發(fā)Material風格的應用结序,這之中就有MaterialApp障斋,ScaffoldToolBarFloatingActionButton等徐鹤。下面看一個使用了這些控件的例子:

修改main.dart內容如下:

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
      title: 'Flutter Tutorial',
      routes: {'/': (RouteArguments args) => new TutorialHome()}));
}

class TutorialHome extends StatelessComponent {
  Widget build(BuildContext context) {
    return new Scaffold(
        toolBar: new ToolBar(
            left: new IconButton(icon: 'navigation/menu'),
            center: new Text('Example title'),
            right: [new IconButton(icon: 'action/search')]),
        body: new Center(child: new Text('Hello, world!')),
        floatingActionButton:
            new FloatingActionButton(child: new Icon(icon: 'content/add')));
  }
}

修改flutter.yaml文件內容如下:

name: my_app
material-design-icons:
  - name: action/search
  - name: content/add
  - name: navigation/menu

運行結果如下:


這里寫圖片描述

現(xiàn)在我們的應用看起來是不是更像是一個Material Design的應用了垃环?我們使用的ScaffoldToolBar讓ToolBar自帶了陰影并且字體風格有有了調整。另外還加上了FloatingActionButton返敬。

總結

本文主要講解flutter中的組件分類遂庄,對如何創(chuàng)建簡單Stateless組件進行了演示

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劲赠,隨后出現(xiàn)的幾起案子涛目,更是在濱河造成了極大的恐慌,老刑警劉巖凛澎,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霹肝,死亡現(xiàn)場離奇詭異,居然都是意外死亡塑煎,警方通過查閱死者的電腦和手機沫换,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來最铁,“玉大人讯赏,你說我怎么就攤上這事垮兑。” “怎么了漱挎?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵系枪,是天一觀的道長。 經(jīng)常有香客問我磕谅,道長私爷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任怜庸,我火速辦了婚禮当犯,結果婚禮上,老公的妹妹穿的比我還像新娘割疾。我一直安慰自己,他們只是感情好嘉栓,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布宏榕。 她就那樣靜靜地躺著,像睡著了一般侵佃。 火紅的嫁衣襯著肌膚如雪麻昼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天馋辈,我揣著相機與錄音抚芦,去河邊找鬼。 笑死迈螟,一個胖子當著我的面吹牛叉抡,可吹牛的內容都是我干的。 我是一名探鬼主播答毫,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼褥民,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洗搂?” 一聲冷哼從身側響起消返,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耘拇,沒想到半個月后撵颊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡惫叛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年倡勇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挣棕。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡译隘,死狀恐怖亲桥,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情固耘,我是刑警寧澤题篷,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站厅目,受9級特大地震影響番枚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜损敷,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一葫笼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拗馒,春花似錦路星、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挥等,卻和暖如春友绝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肝劲。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工迁客, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辞槐。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓掷漱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親催蝗。 傳聞我的和親對象是個殘疾皇子切威,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 以下內容基本翻譯自A Tour of the Flutter Widget Framework,翻譯的可能并不完全...
    INeil閱讀 10,262評論 0 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 2017年11月5號 星期天 天氣晴 每次回老家我都幫婆婆打掃衛(wèi)生丙号,料理家務忙的不可開交先朦,孩子們玩的不亦樂乎! 中...
    松鴿閱讀 133評論 0 0
  • 11 攙起芹子的是小英犬缨。 冬冬喳魏,也早放了自己的白菜,跳到溝渠下面怀薛,把那塊爛白菜舉了上來刺彩。人,也爬了出來,站在她倆身...
    筱昀閱讀 537評論 21 27
  • 說的話像個大啞巴创倔,一口一個爪牙 沒有人說的話嗡害,是一個大啞巴 我是一個啞巴 能說話的啞巴 能漏出牙齒的啞巴 我不說話...
    導演張升志閱讀 454評論 0 0