Flutter基礎(chǔ)組件(4)-GridView

1. GridView的介紹

學(xué)習(xí)過ListView的使用,我們接下來學(xué)習(xí)GridView(網(wǎng)格布局)的使用,GridView有5種構(gòu)造函數(shù):GridView扣癣,GridView.builder,GridView.count,GridView.extent和GridView.custom独柑。
來看下GridView構(gòu)造函數(shù)(已省略不常用屬性):

GridView({
  Key key,
  Axis scrollDirection = Axis.vertical,
  bool reverse = false,
  ScrollController controller,
  ScrollPhysics physics,
  bool shrinkWrap = false,
  EdgeInsetsGeometry padding,
  @required this.gridDelegate,
  double cacheExtent,
  List<Widget> children = const <Widget>[],
})

這里很多的屬性都是和ListView相似的,除了一個在GridView.builder必要的參數(shù)gridDelegate,就讓我們來重點(diǎn)關(guān)注下gridDelegate這個參數(shù)唱凯,它其實(shí)是GridView組件如何控制排列子元素的一個委托伤提。跟蹤源碼我們可以在scroll_view.dart中看到,gridDelegate的類型是SliverGridDelegate偎谁,進(jìn)一步跟蹤進(jìn)sliver_grid.dart可以看到SliverGridDelegate其實(shí)是一個抽象類,而且一共有兩個實(shí)現(xiàn)類:
SliverGridDelegateWithFixedCrossAxisCount:用于固定列數(shù)的場景纲堵;
SliverGridDelegateWithMaxCrossAxisExtent:用于子元素有最大寬度限制的場景巡雨;

2. GridView的使用

想要使用GridView我們就要首先構(gòu)造數(shù)據(jù):

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.cyan,
    );
  }

2.1 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(),
    );

對于這種寫法,此時(shí)單個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,
    );
  }

可以看出沒有效果正蛙。因?yàn)椋覀冊谶@里已經(jīng)指定了每一行分成幾列以及寬高比营曼,還有邊距等等乒验。所以,我們后面再指定單個item的寬高蒂阱,已經(jīng)無效徊件。

2.2 GridView.builder(SliverGridDelegateWithFixedCrossAxisCount)

 Widget build(BuildContext context) {
    List<String> datas = getDataList();
    return GridView.builder(
        itemCount: datas.length,
        //SliverGridDelegateWithFixedCrossAxisCount 構(gòu)建一個橫軸固定數(shù)量Widget
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          //橫軸元素個數(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]);
        });
  }

2.3 GridView.builder(SliverGridDelegateWithMaxCrossAxisExtent)

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

對于SliverGridDelegateWithMaxCrossAxisExtent而言奸攻,水平方向元素個數(shù)不再固定,其水平個數(shù)也就是有幾列虱痕,由maxCrossAxisExtent和屏幕的寬度以及padding和mainAxisSpacing等決定睹耐。

2.4 GridView.custom

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));
  }
                            想了解更多Flutter學(xué)習(xí)知識請聯(lián)系:QQ(814299221)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市部翘,隨后出現(xiàn)的幾起案子硝训,更是在濱河造成了極大的恐慌,老刑警劉巖新思,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窖梁,死亡現(xiàn)場離奇詭異,居然都是意外死亡夹囚,警方通過查閱死者的電腦和手機(jī)纵刘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荸哟,“玉大人假哎,你說我怎么就攤上這事“袄” “怎么了舵抹?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劣砍。 經(jīng)常有香客問我惧蛹,道長,這世上最難降的妖魔是什么刑枝? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任香嗓,我火速辦了婚禮,結(jié)果婚禮上装畅,老公的妹妹穿的比我還像新娘陶缺。我一直安慰自己,他們只是感情好洁灵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布饱岸。 她就那樣靜靜地躺著,像睡著了一般徽千。 火紅的嫁衣襯著肌膚如雪苫费。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天双抽,我揣著相機(jī)與錄音百框,去河邊找鬼。 笑死牍汹,一個胖子當(dāng)著我的面吹牛铐维,可吹牛的內(nèi)容都是我干的柬泽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼嫁蛇,長吁一口氣:“原來是場噩夢啊……” “哼锨并!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睬棚,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤第煮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抑党,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包警,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年底靠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了害晦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡暑中,死狀恐怖壹瘟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痒芝,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布牵素,位于F島的核電站严衬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笆呆。R本人自食惡果不足惜请琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赠幕。 院中可真熱鬧俄精,春花似錦、人聲如沸榕堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆屡。三九已至圾旨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魏蔗,已是汗流浹背砍的。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莺治,地道東北人廓鞠。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓帚稠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親床佳。 傳聞我的和親對象是個殘疾皇子滋早,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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

  • 那個馆衔,Card常常做圓角背景,然后怨绣,Card和ListTile角溃,是經(jīng)常一起玩,ListTile可以試下各種豐富的i...
    阿敏其人閱讀 4,383評論 0 3
  • 1. 前言 Flutter作為時(shí)下最流行的技術(shù)之一篮撑,憑借其出色的性能以及抹平多端的差異優(yōu)勢减细,早已引起大批技術(shù)愛好者...
    小石頭若海閱讀 12,354評論 1 35
  • 在之前講Layout Widget的文章中,我們掌握了基于不同的場景適當(dāng)?shù)倪x擇不同的Widget來完成我們的布局要...
    謝棟閱讀 1,863評論 1 4
  • 看書赢笨,學(xué)習(xí)未蝌,思考,付出行動如此循環(huán) 1茧妒、當(dāng)信息量越來越大的時(shí)候我能做什么萧吠? 我經(jīng)常在思考自己的經(jīng)歷,我是怎么達(dá)到現(xiàn)...
    周建雄key閱讀 409評論 2 2
  • # 晨游之興坪段 晨起路燈車馬稀桐筏,趕筏途纸型,三兩步。為求暢游漓江水梅忌,御寒風(fēng)狰腌,排隊(duì)頭。 錢山起牧氮,淺水游琼腔。話談駱駝馱天際...
    野生偽裝閱讀 437評論 0 0