注:全部文章均不會詳細講解基礎widget的使用,你們能夠查看官方文檔,若有使用問題能夠在評論中提出。前期搭建環境工做還沒準備好的小夥伴,能夠個人 上一篇找官方文檔連接,跟着官方文檔就好了。
從今天開始,我將記錄在學習Flutter
過程當中的遇到的一些具體問題,對照着Android
中的實現用Flutter
去解決這些問題,而且會對用到的widget講解一些本身的理解,方便你們更好的學習Flutter。
git
還有重要的一點要提,你們必定牢記於心,就像🐔你太美同樣😏:github
Flutter中萬物皆widget!!!segmentfault
Flutter中萬物皆widget!!!佈局
Flutter中萬物皆widget!!!學習
重要的事情說三遍。spa
咱們先來看一下大概的效果是什麼樣的:code
藍色框框圈出來就是咱們要實現的佈局,這種兩個view
分別居父佈局的左邊和右邊,你們應該很常見。在Android
當中,一個RelativeLayout
中放兩個TextView
,而後給後面一個TextView設置layout_alignParentRight
就能夠了(第一個TextView
默認已經從左邊開始),或者也有小夥伴說用ConstraintLayout
也能夠實現,總之在Android
中這類佈局很容易實現。blog
那咱們Flutter
中應該怎麼實現?rem
首先我先說一下Flutter
中的基礎widget
和Android
中的View
的區別,就拿Flutter
中的Text
和Android
中的TextView
作比較:文檔
Text
在Flutter
中只負責文字的顯示,連設置寬高的屬性都沒有,更別說TextView
的margin
和padding
屬性了(其餘基礎widget
也是,包括Image
,RaisedButton
等等)。因此我理解的是Flutter
中的這些基礎widget
只負責本身的單一職責,好比Text
,只負責文本的顯示。widget
沒有移動本身位置的屬性,因此Flutter
中就有了align
,padding
等等這些widget來給移動基礎widget
的位置。Text
能夠經過textAlign
來設置內部文字的位置,相似TextView
的Gravity
屬性。可是Text沒有相似Layout_Gravity
屬性。好了,說了這麼多,咱們來看Flutter中的具體實現,Flutter中也有多種實現方式,下面咱們一一講解。
直接上代碼:
//Stack相似FrameLayout,子widget能夠經過父容器的四個角固定位置,子widget能夠重疊。 Stack( children: <Widget>[ //能夠經過alignment屬性,設置其子widget與其對齊方式,默認center; //因此下面咱們分別給註冊和登陸設置了居左和居右 Align( alignment: Alignment.centerLeft, child: Text( "註冊", style: TextStyle(color: Colors.red, fontSize: 20), ), ), Align( alignment: Alignment.centerRight, child: Text( "忘記密碼", style: TextStyle(color: Colors.red, fontSize: 20), ), ), ], ),
仍是直接上代碼:
//Row在水平方向佈局widget,相似Android中設置了horizontal的LinearLayout Row( //Row是在水平方向佈局子widget,因此mainAxisAlignment是指子widget在水平方向上的位置。具體屬性下面具體講解 mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ Text( "註冊", style: TextStyle(color: Colors.red, fontSize: 20), ), Text( "忘記密碼", style: TextStyle(color: Colors.red, fontSize: 20), ), ], ),
其實我纔開始作這個佈局的時候,我第一個想到的就是用Row
,可是並無相似RelativeLayout
那種子View
能夠設置居左,居右的屬性。加上纔開始學的不仔細,就放棄這種方式了,用第一種方式實現了。不過通過後面的學習,發現Row
實際上是能夠實現的。
你們其實看上面的代碼,比第一種實現方式代碼反而更簡單。相信你們也注意到重點了,就是這句代碼
mainAxisAlignment: MainAxisAlignment.spaceBetween
我纔開始只是簡單使用了MainAxisAlignment.start/center/end
這幾個屬性,因此沒實現成功。後面我專門看了下剩下幾個屬性,以下:
// Place the free space evenly between the children. MainAxisAlignment.spaceBetween // Place the free space evenly between the children as well as half of that // space before and after the first and last child. MainAxisAlignment.spaceAround // Place the free space evenly between the children as well as before and // after the first and last child. MainAxisAlignment.spaceEvenly
源碼註釋我放出來了,你們能夠先看一下,本身先理解一下。由於我以爲這幾個屬性仍是比較難理解的,因此準備在下一篇中詳細講解。
哦,忘記放出上面兩種實現效果了,來了,biubiu!
詳細代碼我也都上傳到gayhub上面了FlutterTour,這個項目我將會持續記錄全部實例代碼,歡迎你們動動小手,給個star吧😘😘😘。