視訊在文章的最後,可以直接跳到最後看視訊。
這一季將集中火力,死磕Flutter的API,也就是元件(widget)的使用,我們儘量把常用的都講到,這也算學習中最辛苦的一章,因為你要記憶的內容會很多。但是學完後,會很有成就感。(但學習這一季,你必須先把第一季看了,否則沒有開發環境是沒辦法繼續學習的。)
通過第一季的學習,你一定已經安裝好了Flutter開發環境,這篇文章我們將講解Flutter的基本組建,我會把最常用的屬性都進行講解,但並不一定完全,目的是使用最少的時間快速上手Flutter。
第01節:Text Widget 文字元件的使用
在開始學習Text元件前,我們再來複習一遍最基本的程式碼編寫,肯定有些小夥伴已經忘記了。我們來快速寫一個HelloWorld程式出來。
在寫的時候,你要一直念一個咒語,這樣對以後的學習會很有幫助,咒語就是:"Flutter一切皆元件!"有了這個印象後,我們剩下的課程就好學了。
看一下最基礎的HelloWold程式碼。
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Text('Hello JSPang')
),
),
);
}
}
複製程式碼
這裡我們已經使用了一個最簡單的Text元件了,但是我們所有屬性都是預設的的,下面我們就來多一點修飾這個Text元件。
TextAlign屬性
TextAlign屬性就是文字的對齊方式,它的屬性值有如下幾個(詳細請看視訊中講解):
- center: 文字以居中形式對齊,這個也算比較常用的了。
- left:左對齊,經常使用,讓文字居左進行對齊,效果和start一樣。
- right :右對齊,使用頻率也不算高。
- start:以開始位置進行對齊,類似於左對齊。
- end: 以為本結尾處進行對齊,不常用。有點類似右對齊.
總結起來,也就算三個對齊方式,left(左對齊)、center(居中對齊)、right(右對齊)。我們來看一下具體程式碼:
child:Text(
'Hello JSPang ,非常喜歡前端,並且願意為此奮鬥一生。我希望可以出1000集免費教程。',
textAlign:TextAlign.left,
)
複製程式碼
maxLines屬性
設定最多顯示的行數,比如我們現在只顯示1行,類似一個新聞列表的題目。程式碼如下:
child:Text(
'Hello JSPang ,非常喜歡前端,並且願意為此奮鬥一生。我希望可以出1000集免費教程。',
textAlign:TextAlign.left,
maxLines: 1,
)
複製程式碼
設定好後,文字只能顯示出1行了。
overflow屬性
overflow屬性是用來設定文字溢位時,如何處理,它有下面幾個常用的值供我們選擇。
- clip:直接切斷,剩下的文字就沒有了,感覺不太友好,體驗性不好。
- ellipsis:在後邊顯示省略號,體驗性較好,這個在工作中經常使用。
- fade: 溢位的部分會進行一個漸變消失的效果,當然是上線的漸變,不是左右的哦。
style屬性
style屬性的內容比較多,具體的你可以查一下API,我這裡帶作一個效果,方便大家快速學會Style的用法。
我們下面要作的效果為,字型大小為25.0,顏色為粉紅色,並且有一個下劃線。
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Text(
'Hello JSPang ,非常喜歡前端,並且願意為此奮鬥一生。我希望可以出1000集免費教程。',
textAlign:TextAlign.left,
overflow:TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
fontSize:25.0,
color:Color.fromARGB(255, 255, 150, 150),
decoration:TextDecoration.underline,
decorationStyle:TextDecorationStyle.solid,
),
)
),
),
);
}
}
複製程式碼
更詳細的屬性資料可以參看這個網址:docs.flutter.io/flutter/pai…
其實程式設計師最重要的一個能力就是檢視文件的能力,我這裡也只是講些最常使用的,在實際工作中,還是要多查穩定。
第02節:Container容器元件的使用1
Container(容器控制元件)在Flutter是經常使用的控制元件,它就相當於我們HTML裡的<div>
標籤,每個頁面或者說每個檢視都離不開它。那這節課我們就來學習一下。
補充:在VSCode中方便開啟虛擬機器
很多小夥伴給我發私信說,自己寫個批處理檔案太麻煩了。能不能在VSCode裡就直接開啟那?當然是可以的,這個也是群友蒙星教我的。(感謝你的指導,讓我學會了新的技能)
在安裝了Flutter和Dart外掛以後,在VSCode的右下角顯示No Devices
,我們直接點選它,就會顯示我們電腦中安裝的虛擬機器,如果你電腦上沒有,也可以進行安裝。(詳細開視訊中如何進行配置)
Alignment屬性
其實容器的作用就是方便我們進行佈局的,Flutter這點也作的很好,我們先來看容器屬性中的Alignment
。
這個屬性針對的是Container內child的對齊方式,也就是容器子內容的對齊方式,並不是容器本身的對齊方式。
先作一個效果:建立一個容器,然後容器內加入一段文字Hello JSPang
, 並讓它居中對齊。
具體程式碼如下:
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.center,
),
),
),
);
}
}
複製程式碼
這時候可以看見,我們的文字已經居中顯示在手機螢幕上了。當然它的對齊方式還有如下幾種:
bottomCenter
:下部居中對齊。botomLeft
: 下部左對齊。bottomRight
:下部右對齊。center
:縱橫雙向居中對齊。centerLeft
:縱向居中橫向居左對齊。centerRight
:縱向居中橫向居右對齊。topLeft
:頂部左側對齊。topCenter
:頂部居中對齊。topRight
: 頂部居左對齊。
設定寬、高和顏色屬性
設定寬、高和顏色屬性是相對容易的,只要在屬性名稱後面加入浮點型數字就可以了,比如要設定寬是500,高是400,顏色為亮藍色。程式碼如下:
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.center,
width:500.0,
height:400.0,
color: Colors.lightBlue,
),
複製程式碼
實現的效果如圖所示:
這節課還是比較簡單的,下節課需要繼續學習Conatainer中padding和margin屬性。
第03節:Container容器元件的使用2
上節已經簡單的學習了一下Container容器元件的用法,這節我們繼續學習,主要講解一下的padding
,margin
和decoration
這幾個屬性。我們先來看看Padding屬性。
padding屬性
padding的屬性就是一個內邊距,它和你使用的前端技術CSS裡的padding
表現形式一樣,指的是Container邊緣和child內容的距離。先來看一個內邊距為10的例子。具體程式碼如下(我們還是接著上節課的程式碼來寫):
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.topLeft,
width:500.0,
height:400.0,
color: Colors.lightBlue,
padding:const EdgeInsets.all(10.0),
),
複製程式碼
上面主要的padding程式碼就一句。
padding:const EdgeInsets.all(10.0),
複製程式碼
這句的意思是設定Container
的內邊距是10,左右上下全部為10,這看起來非常容易。那我們再加大一點難度。如果上邊距為30,左邊距為10,這時候EdgeInsets.all()
就滿足不了我們了。
** EdgeInsets.fromLTRB(value1,value2,value3,value4)
**
我們用EdgeInsets.fromLTRB(value1,value2,value3,value4)
可以滿足我們的需求,LTRB
分別代表左、上、右、下。
那我們設定上邊距為30,左邊距為10,就可以用下面的程式碼來編寫。
padding:const EdgeInsets.fromLTRB(10.0,30.0,0.0,0.0),
複製程式碼
這時候我們的結果就變成了下圖。
有了這兩個屬性,基本就可以滿足我們的工作需要了。
margin屬性
會了padding屬性的設定,margin就變的非常容易了,因為方法基本上一樣。不過margin是外邊距,只的是container和外部元素的距離。
現在要把container的外邊距設定為10個單位,程式碼如下:
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.topLeft,
width:500.0,
height:400.0,
color: Colors.lightBlue,
padding:const EdgeInsets.fromLTRB(10.0,30.0,0.0,0.0),
margin: const EdgeInsets.all(10.0),
),
複製程式碼
圖中可以看出,已經有了明顯的外邊距。
當然你也可以分別設定不同的外邊距,方法也是使用fromLTRB
,我在視訊中演示,這裡就不累述了。
decoration屬性
decoration
是 container 的修飾器,主要的功能是設定背景和邊框。
比如你需要給背景加入一個漸變,這時候需要使用BoxDecoration這個類,程式碼如下(需要注意的是如果你設定了decoration,就不要再設定color屬性了,因為這樣會衝突)。
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.topLeft,
width:500.0,
height:400.0,
padding:const EdgeInsets.fromLTRB(10.0,30.0,0.0,0.0),
margin: const EdgeInsets.all(10.0),
decoration:new BoxDecoration(
gradient:const LinearGradient(
colors:[Colors.lightBlue,Colors.greenAccent,Colors.purple]
)
),
),
複製程式碼
上面的程式碼去掉了color的設定,這時候container的背景就變成了漸變顏色,如下圖。
設定邊框
設定邊框可以在decoration裡設定border屬性,比如你現在要設定一個紅色邊框,寬度為2。程式碼如下:
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.topLeft,
width:500.0,
height:400.0,
padding:const EdgeInsets.fromLTRB(10.0,30.0,0.0,0.0),
margin: const EdgeInsets.all(10.0),
decoration:new BoxDecoration(
gradient:const LinearGradient(
colors:[Colors.lightBlue,Colors.greenAccent,Colors.purple]
),
border:Border.all(width:2.0,color:Colors.red)
),
),
複製程式碼
關鍵程式碼其實就是:
border:Border.all(width:2.0,color:Colors.red)
複製程式碼
這時候就有了邊框顯示,我就不給大家上圖片了,如果有需要視訊中檢視吧。
這節課就到這裡,希望小夥伴們都能動手練習起來。在這裡附上全部程式碼,方便小夥伴們學習。
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Container(
child:new Text('Hello JSPang',style: TextStyle(fontSize: 40.0),),
alignment: Alignment.topLeft,
width:500.0,
height:400.0,
padding:const EdgeInsets.fromLTRB(10.0,30.0,0.0,0.0),
margin: const EdgeInsets.all(10.0),
decoration:new BoxDecoration(
gradient:const LinearGradient(
colors:[Colors.lightBlue,Colors.greenAccent,Colors.purple]
),
border:Border.all(width:2.0,color:Colors.red)
),
),
),
),
);
}
}
複製程式碼
第04節:Image圖片元件的使用
我們都希望自己作的程式賞心悅目,俗話說的好一圖頂千言,所以圖片的運用在程式製作裡至關重要。這節課我們就來看一下圖片元件的使用。
加入圖片的幾種方式
- Image.asset:載入資源圖片,就是載入專案資源目錄中的圖片,加入圖片後會增大打包的包體體積,用的是相對路徑。
- Image.network:網路資源圖片,意思就是你需要加入一段http://xxxx.xxx的這樣的網路路徑地址。
- Image.file:載入本地圖片,就是載入本地檔案中的圖片,這個是一個絕對路徑,跟包體無關。
- Image.memory: 載入Uint8List資源圖片,這個我目前用的不是很多,所以沒什麼發言權。
我們現在就以加入網路圖片為例子,在Container里加入一張圖片,程式碼如下:
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Container(
child:new Image.network(
'http://jspang.com/static/myimg/blogtouxiang.jpg',
scale:1.0,
),
width:300.0,
height:200.0,
color: Colors.lightBlue,
),
),
),
);
}
}
複製程式碼
這時候就可以看到圖片被加入進來了,當然我們還順便設定了容器的寬和高。
fit屬性的設定
fit屬性可以控制圖片的拉伸和擠壓,這些都是根據圖片的父級容器來的,我們先來看看這些屬性(建議此部分組好看視訊理解)。
-
BoxFit.fill:全圖顯示,圖片會被拉伸,並充滿父容器。
-
BoxFit.contain:全圖顯示,顯示原比例,可能會有空隙。
-
BoxFit.cover:顯示可能拉伸,可能裁切,充滿(圖片要充滿整個容器,還不變形)。
-
BoxFit.fitWidth:寬度充滿(橫向充滿),顯示可能拉伸,可能裁切。
-
BoxFit.fitHeight :高度充滿(豎向充滿),顯示可能拉伸,可能裁切。
-
BoxFit.scaleDown:效果和contain差不多,但是此屬性不允許顯示超過源圖片大小,可小不可大。
這部分我會在視訊中充分演示,每一個效果都會作對應的演示,建議收看視訊進行理解。
圖片的混合模式
圖片混合模式(colorBlendMode)和color屬性配合使用,能讓圖片改變顏色,裡邊的模式非常的多,產生的效果也是非常豐富的。在這裡作幾個簡單的例子,讓大家看一下效果,剩下的留給小夥伴自己探索。
child:new Image.network(
'http://jspang.com/static/myimg/blogtouxiang.jpg',
color: Colors.greenAccent,
colorBlendMode: BlendMode.darken,
),
複製程式碼
- color:是要混合的顏色,如果你只設定color是沒有意義的。
- colorBlendMode:是混合模式,相當於我們如何混合。
repeat圖片重複
-
ImageRepeat.repeat : 橫向和縱向都進行重複,直到鋪滿整個畫布。
-
ImageRepeat.repeatX: 橫向重複,縱向不重複。
-
ImageRepeat.repeatY:縱向重複,橫向不重複。
來個全部重複的程式碼。
child:new Image.network(
'http://jspang.com/static/myimg/blogtouxiang.jpg',
repeat: ImageRepeat.repeat,
),
複製程式碼
圖片的使用在程式中我覺的是非常有意思的,也能製作出很多酷炫的效果,你可以把你作出的效果給我留言哦。下節課見了。
第05節:ListView 列表元件簡介
列表元件的知識其實是很多的,也是一個經常使用的元件,我們這裡先作一個簡介,讓大家有個直觀的感受,先敲開大門,大家就好深入了。這節我們先學習最簡單的列表元件如何製作。
ListView的宣告
學習不僅要學,還要不斷的練習,這節我們重新熟悉一下一個Flutter頁面的基本寫法,因為前面已經學過,所以我相信很多小夥伴已經都會了,但是我麼年主要是練習,程式碼如下:
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context){
return MaterialApp(
title:'JSPang Flutter Demo',
home:Scaffold(
appBar:new AppBar(
title:new Text('ListView Widget')
),
body: new Text('ListView Text')
),
);
}
}
複製程式碼
這就是一個最基本的機構,具體解釋和寫法看視訊吧。
有了最基本的結構後,就可以加入ListView元件,在body
程式碼處加入下面的程式碼:
body: new ListView(
children:<Widget>[
new ListTile(
leading:new Icon(Icons.access_time),
title:new Text('access_time')
)
]
),
複製程式碼
我們使用了ListView,然後在他的內部children
中,使用了widget
陣列,因為是一個列表,所以它接受一個陣列,然後有使用了listTite元件(列表瓦片),在元件中放置了圖示和文字。
當然我們還可以多加入幾行列表,比如我們再加入一行,程式碼如下。
body: new ListView(
children:<Widget>[
new ListTile(
leading:new Icon(Icons.access_time),
title:new Text('access_time')
),
new ListTile(
leading:new Icon(Icons.account_balance),
title:new Text('account_balance')
),
]
),
複製程式碼
這時候已經有兩行列表了(具體效果視訊中檢視)。
圖片列表的使用
上節課學習了Image Widget,在這裡我們就在列表中加入圖片來試一下。我們插入4幅圖片,然後看一下效果,程式碼如下:
body: new ListView(
children:<Widget>[
new Image.network(
'http://jspang.com/static/upload/20181111/G-wj-ZQuocWlYOHM6MT2Hbh5.jpg'
),
new Image.network(
'http://jspang.com/static/upload/20181109/1bHNoNGpZjyriCNcvqdKo3s6.jpg'
),
new Image.network(
'http://jspang.com/static/myimg/typescript_banner.jpg'
),new Image.network(
'http://jspang.com/static/myimg/smile-vue.jpg'
)
]
),
複製程式碼
我們使用了網路的方式,插入了4張圖片,並且這4張圖片形成了一個列表。小夥伴們快動手試一試吧。
第06節:橫向列表的使用
已經對ListView有了清楚的認識,也做出了普通的縱向(豎向列表)。這節課我們看看橫向列表如何使用。其實還是使用我們的ListView元件,只是在ListView元件里加一個ScrollDirection
屬性。
製作橫向列表
這個我們先來看效果,然後再具體講解使用方法:
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Container(
height:200.0,
child:new ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
new Container(
width:180.0,
color: Colors.lightBlue,
), new Container(
width:180.0,
color: Colors.amber,
), new Container(
width:180.0,
color: Colors.deepOrange,
),new Container(
width:180.0,
color: Colors.deepPurpleAccent,
),
],
)
),
),
),
);
}
}
複製程式碼
我們先是加入了Center元件,作用是讓我們的橫向列表可以居中到螢幕的中間位置,然後在center元件的下面加入了Container容器元件,並設定了容器元件的高是200,在容器元件裡我們加入了ListView
元件,然後設定了元件的scrollDirection屬性。然後再ListView的子元件里加入了Container容器元件,然後設定了不同顏色,效果如圖。
scrollDirection屬性
ListView元件的scrollDirection
屬性只有兩個值,一個是橫向滾動,一個是縱向滾動。預設的就是垂直滾動,所以如果是垂直滾動,我們一般都不進行設定。
- Axis.horizontal:橫向滾動或者叫水平方向滾動。
- Axis.vertical:縱向滾動或者叫垂直方向滾動。
優化程式碼簡介
學到這裡,我相信很多小夥伴一定心裡很多草泥馬在崩騰了,Flutter太反人類了,全是巢狀,讓我們如何維護。其實這不能怪Flutter,這是我為了教學簡單,所以沒有把元件分開定義。
現在把列表元件獨立定義成一個類,然後我們再加入到主元件中。再工作中會把元件分的很細,這樣既能很好的複用有便於維護,還有利於分工,我個人是非常喜歡Flutter這種萬物皆元件的形式的。
我們宣告一個MyList的類,然後把巢狀的程式碼放到這個類裡,程式碼如下。
class MyList extends StatelessWidget{
@override
Widget build(BuildContext context){
return ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
new Container(
width:180.0,
color: Colors.lightBlue,
), new Container(
width:180.0,
color: Colors.amber,
), new Container(
width:180.0,
color: Colors.deepOrange,
),new Container(
width:180.0,
color: Colors.deepPurpleAccent,
),
],
);
}
}
複製程式碼
然後再MyAPP類裡直接使用這個類,這樣就減少了巢狀。全部程式碼如下,詳細的講解看視訊吧。
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'ListView widget',
home:Scaffold(
body:Center(
child:Container(
height:200.0,
child:MyList()
),
),
),
);
}
}
class MyList extends StatelessWidget{
@override
Widget build(BuildContext context){
return ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
new Container(
width:180.0,
color: Colors.lightBlue,
), new Container(
width:180.0,
color: Colors.amber,
), new Container(
width:180.0,
color: Colors.deepOrange,
),new Container(
width:180.0,
color: Colors.deepPurpleAccent,
),
],
);
}
}
複製程式碼
這節課就到這裡了,主要就是學一下橫向列表如何製作和如何減少巢狀。希望小夥伴們都能有所收穫。下節課見了。
第07節:動態列表的使用
有經驗的程式設計師都知道,其實我們在實際開發中,這種寫死的,或者叫靜態的列表使用的非常少。我們常用的是動態列表,比如我們的資料從後臺讀取過來,然後存入一個變數陣列裡,然後以陣列的內容迴圈出一個列表。
再直觀的講,比如我們訪問淘寶的頁面,這時候資料是動態的,這樣的列表如何實現,這節課就學習一下。
List型別的使用
List是Dart的集合型別之一,其實你可以把它簡單理解為陣列(反正我是這麼認為的),其他語言也都有這個型別。它的宣告有幾種方式:
var myList = List()
: 非固定長度的宣告。var myList = List(2)
: 固定長度的宣告。var myList= List<String>()
:固定型別的宣告方式。var myList = [1,2,3]
: 對List直接賦值。
那我們這裡使用的是一個List傳遞,然後直接用List中的generate
方法進行生產List裡的元素。最後的結果是生產了一個帶值的List變數。程式碼如下:
void main () => runApp(MyApp(
items: new List<String>.generate(1000, (i)=> "Item $i")
));
複製程式碼
說明:再main
函式的runApp中呼叫了MyApp類,再使用類的使用傳遞了一個items
引數,並使用generate生成器對items
進行賦值。
generate方法傳遞兩個引數,第一個引數是生成的個數,第二個是方法。
接受引數
我們已經傳遞了引數,那MyApp這個類是需要接收的。
final List<String> items;
MyApp({Key key, @required this.items}):super(key:key);
複製程式碼
這是一個建構函式,除了Key,我們增加了一個必傳引數,這裡的@required
意思就必傳。:super
如果父類沒有無名無引數的預設建構函式,則子類必須手動呼叫一個父類建構函式。
這樣我們就可以接收一個傳遞過來的引數了,當然我們要事先進行宣告。
動態列表 ListView.builder()
接受了值之後,就可以直接呼叫動態列表進行生成了。具體程式碼如下:
import 'package:flutter/material.dart';
void main () => runApp(MyApp(
items: new List<String>.generate(1000, (i)=> "Item $i")
));
class MyApp extends StatelessWidget{
final List<String> items;
MyApp({Key key, @required this.items}):super(key:key);
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'ListView widget',
home:Scaffold(
body:new ListView.builder(
itemCount:items.length,
itemBuilder:(context,index){
return new ListTile(
title:new Text('${items[index]}'),
);
}
)
),
);
}
}
複製程式碼
現在我們可以啟動虛擬機器來檢視,我們的列表的效果了。這個就是工作中我們常使用的列表的方式,當然我們也可以重新做一個列表類,把元件作的美美的。
小夥伴可以試著來作一個帶圖文的新聞列表。
第08節:GridView網格列表元件
列表元件已經學會了,那還有一種常用的列表,叫做網格列表。網格列表經常用來顯示多張圖片,比如我們經常使用的手機裡的相簿功能,大部分形式都是網格列表。
簡單例子演示
我們先不做一個相簿的應用,而是使用文字,作一個最簡單的網格列表,目的是先熟悉一下GridView
的基本語法,程式碼如下,視訊中會進行詳細講解:
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'ListView widget',
home:Scaffold(
body:GridView.count(
padding:const EdgeInsets.all(20.0),
crossAxisSpacing: 10.0,
crossAxisCount: 3,
children: <Widget>[
const Text('I am Jspang'),
const Text('I love Web'),
const Text('jspang.com'),
const Text('我喜歡玩遊戲'),
const Text('我喜歡看書'),
const Text('我喜歡吃火鍋')
],
)
),
);
}
}
複製程式碼
我們在body屬性中加入了網格元件,然後給了一些常用屬性:
- padding:表示內邊距,這個小夥伴們應該很熟悉。
- crossAxisSpacing:網格間的空當,相當於每個網格之間的間距。
- crossAxisCount:網格的列數,相當於一行放置的網格數量。
圖片網格列表
加入文字作網格列表總是怪怪的,也不是很直觀,我們利用圖片來作一些網格列表。當然我們用一種更原生的方法,現在官方已經不鼓勵使用這種方法了,但是為了你碰到時,不至於不知道怎麼回事,所以我們作一下這種形式,但主要是為了作圖片佈局。
程式碼如下:
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'ListView widget',
home:Scaffold(
body:GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 2.0,
crossAxisSpacing: 2.0,
childAspectRatio: 0.7
),
children: <Widget>[
new Image.network('http://img5.mtime.cn/mt/2018/10/22/104316.77318635_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/10/10/112514.30587089_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/13/093605.61422332_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/07/092515.55805319_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/21/090246.16772408_135X190X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/17/162028.94879602_135X190X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/19/165350.52237320_135X190X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/16/115256.24365160_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/20/141608.71613590_135X190X4.jpg',fit: BoxFit.cover),
],
)
),
);
}
}
複製程式碼
- childAspectRatio:寬高比,這個值的意思是寬是高的多少倍,如果寬是高的2倍,那我們就寫2.0,如果高是寬的2倍,我們就寫0.5。希望小夥伴們理解一下。
這節課就到這裡,希望小夥伴們有所收穫,作一個自己喜歡的圖片集出來。
視訊連線地址
共14集:www.bilibili.com/video/av358…
學習討論QQ群:674639629(千人群)
入群問題:Flutter出自於哪個公司?
入群答案:google