Flutter GridView

今天,我們來聊聊網(wǎng)格布局GridView。


GridView

構(gòu)造數(shù)據(jù)(生成Widgets)


List<String> getDataList() {
    List<String> list = [];
    for (int i = 0; i < 100; i++) {
      list.add(i.toString());
    }
    return list;
  }

  List<Widget> getWidgetList() {
    return getDataList().map((item) => getItemContainer(item)).toList();
  }

  Widget getItemContainer(String item) {
    return Container(
      alignment: Alignment.center,
      child: Text(
        item,
        style: TextStyle(color: Colors.white, fontSize: 20),
      ),
      color: Colors.blue,
    );
  }

GridView有好幾種寫法露乏,萬變不離其宗车海。我們一個(gè)個(gè)來看看笛园。

寫法一:GridView.count


GridView.count(
      //水平子Widget之間間距
      crossAxisSpacing: 10.0,
      //垂直子Widget之間間距
      mainAxisSpacing: 30.0,
      //GridView內(nèi)邊距
      padding: EdgeInsets.all(10.0),
      //一行的Widget數(shù)量
      crossAxisCount: 2,
      //子Widget寬高比例
      childAspectRatio: 2.0,
      //子Widget列表
      children: getWidgetList(),
    );

效果:


GridView.count.gif

對(duì)于這種寫法,此時(shí)單個(gè)Widget的寬高已經(jīng)不起作用了。
在我上面構(gòu)造數(shù)據(jù)的那一步中研铆,我并沒有指定Container的的寬高埋同,這里我們就將其寬高設(shè)置為5,看下效果棵红。


Widget getItemContainer(String item) {
    return Container(
      width: 5.0,
      height: 5.0,
      alignment: Alignment.center,
      child: Text(
        item,
        style: TextStyle(color: Colors.white, fontSize: 20),
      ),
      color: Colors.blue,
    );
  }

指定Container 寬高

可以看出沒有效果凶赁。因?yàn)椋覀冊(cè)谶@里已經(jīng)指定了每一行分成幾列以及寬高比逆甜,還有邊距等等哟冬。所以,我們后面再指定單個(gè)item的寬高忆绰,已經(jīng)無效浩峡。

其實(shí)GridView跟我之前講過的ListView,基本類似错敢,都是BoxScrollView的子類翰灾。

GridView與ListView比較

GridView與ListView比較

寫法二:GridView.builder


 @override
  Widget build(BuildContext context) {
    List<String> datas = getDataList();
    return GridView.builder(
        itemCount: datas.length,
        //SliverGridDelegateWithFixedCrossAxisCount 構(gòu)建一個(gè)橫軸固定數(shù)量Widget
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          //橫軸元素個(gè)數(shù)
            crossAxisCount: 3,
            //縱軸間距
            mainAxisSpacing: 20.0,
            //橫軸間距
            crossAxisSpacing: 10.0,
            //子組件寬高長度比例
            childAspectRatio: 1.0),
        itemBuilder: (BuildContext context, int index) {
          //Widget Function(BuildContext context, int index)
          return getItemContainer(datas[index]);
        });
  }

abstract class SliverGridDelegate gridDelegate用來指定GridView的構(gòu)建方式,具體實(shí)現(xiàn)有兩個(gè)稚茅。

SliverGridDelegate

剛才這里例子纸淮,使用的SliverGridDelegateWithFixedCrossAxisCount。下面亚享,我們來使用它的另一個(gè)實(shí)現(xiàn)SliverGridDelegateWithMaxCrossAxisExtent咽块。

寫法三:GridView.builder(SliverGridDelegateWithMaxCrossAxisExtent)


GridView.builder(
      itemCount: datas.length,
      itemBuilder: (BuildContext context, int index) {
        return getItemContainer(datas[index]);
      },
      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
        //單個(gè)子Widget的水平最大寬度
        maxCrossAxisExtent: 200,
        //水平單個(gè)子Widget之間間距
        mainAxisSpacing: 20.0,
        //垂直單個(gè)子Widget之間間距
        crossAxisSpacing: 10.0
      ),
    );

對(duì)于SliverGridDelegateWithMaxCrossAxisExtent而言,水平方向元素個(gè)數(shù)不再固定欺税,其水平個(gè)數(shù)也就是有幾列侈沪,由maxCrossAxisExtent和屏幕的寬度以及paddingmainAxisSpacing等決定。

例如:我這里的虛擬機(jī)寬度為400晚凿,當(dāng)maxCrossAxisExtent:50時(shí)亭罪,有8列;當(dāng)maxCrossAxisExtent:100時(shí)歼秽,有4列应役。如下:

maxCrossAxisExtent 效果
內(nèi)容 內(nèi)容
maxCrossAxisExtent:50
image.png
maxCrossAxisExtent:100
image.png

寫法四:


@override
  Widget build(BuildContext context) {
    List<String> datas = getDataList();
    return GridView.custom(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 3, mainAxisSpacing: 10.0, crossAxisSpacing: 20.0, ),
        childrenDelegate: SliverChildBuilderDelegate((context, position) {
          return getItemContainer(datas[position]);
        }, childCount: datas.length));
  }
GridView.custom.gif

這幾個(gè)參數(shù),上面都講過了燥筷,不再贅述了箩祥。

本文代碼地址

Flutter 豆瓣客戶端,誠心開源
Flutter Container
Flutter SafeArea
Flutter Row Column MainAxisAlignment Expanded
Flutter Image全解析
Flutter 常用按鈕總結(jié)
Flutter ListView豆瓣電影排行榜
Flutter Card
Flutter Navigator&Router(導(dǎo)航與路由)
OverscrollNotification不起效果引起的Flutter感悟分享
Flutter 上拉抽屜實(shí)現(xiàn)
Flutter 豆瓣客戶端肆氓,誠心開源
Flutter 更改狀態(tài)欄顏色

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袍祖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子做院,更是在濱河造成了極大的恐慌盲泛,老刑警劉巖濒持,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寺滚,居然都是意外死亡柑营,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門村视,熙熙樓的掌柜王于貴愁眉苦臉地迎上來官套,“玉大人,你說我怎么就攤上這事蚁孔∧膛猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵杠氢,是天一觀的道長站刑。 經(jīng)常有香客問我,道長鼻百,這世上最難降的妖魔是什么绞旅? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮温艇,結(jié)果婚禮上因悲,老公的妹妹穿的比我還像新娘。我一直安慰自己勺爱,他們只是感情好晃琳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琐鲁,像睡著了一般卫旱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绣否,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天誊涯,我揣著相機(jī)與錄音,去河邊找鬼蒜撮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跪呈,可吹牛的內(nèi)容都是我干的段磨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼耗绿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼苹支!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起误阻,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤债蜜,失蹤者是張志新(化名)和其女友劉穎晴埂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寻定,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儒洛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狼速。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅锻。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖向胡,靈堂內(nèi)的尸體忽然破棺而出恼蓬,到底是詐尸還是另有隱情,我是刑警寧澤僵芹,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布处硬,位于F島的核電站,受9級(jí)特大地震影響拇派,放射性物質(zhì)發(fā)生泄漏荷辕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一攀痊、第九天 我趴在偏房一處隱蔽的房頂上張望桐腌。 院中可真熱鬧,春花似錦苟径、人聲如沸案站。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟆盐。三九已至,卻和暖如春遭殉,著一層夾襖步出監(jiān)牢的瞬間石挂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工险污, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痹愚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓蛔糯,卻偏偏與公主長得像拯腮,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚁飒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • GridView 是一個(gè)網(wǎng)格布局的列組件动壤。GridView 繼承至 CustomScrollView,有 Cust...
    iwakevin閱讀 5,572評(píng)論 1 2
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程淮逻,因...
    小菜c閱讀 6,424評(píng)論 0 17
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案琼懊? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5阁簸? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,486評(píng)論 1 45
  • 7寶寶們陸陸續(xù)續(xù)的來到了塔塔班哼丈,開啟在塔塔班一天的美好時(shí)光启妹。 妞妞很安靜地坐在蘋蘋老師腿上,讓蘋蘋老師給自己扎頭發(fā)...
    RYB塔塔班2閱讀 194評(píng)論 0 0