GridView 網(wǎng)格布局

GridView.count 靜態(tài)網(wǎng)格布局

頁面均分布局,對(duì)設(shè)置高度,寬度是無效的.但是可以通過childAspectRatio(寬度/高度的比例.)屬性來配置寬高比例來控制顯示效果.

名稱 類型 說明
scrollDirection Axis 滾動(dòng)方法
padding EdgeInsetsGeometry 內(nèi)邊距
resolve bool 組件反向排版
crossAxisSpacing double 水平子Widget 之間間距
mainAxisSpacing double 垂直子Widget 之間間距
crossAxisCount int 一行的Widget 數(shù)量
childAspectRatio fouble 子Widget 寬高比例
children <Widget> []
gridDelegate SliverGridDelegateWithFixedCrossAxisCount(常用)SliverGridDelegateWithMaxCrossAxisExtent 控制布局主要用在GridView.builder 里面

通過循環(huán)一套數(shù)據(jù),使用上面的屬性來控制GridView效果:

import "package:flutter/material.dart";
void main() => runApp(MyApp());
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Container(
      child: MaterialApp(
        title: 'belineApp',
        home: Scaffold(
          appBar: AppBar(
            title: Text('my app'),
          ),
          body: StateList()
        )
      )
    );
  }
}
class StateList extends StatelessWidget {
  @override
  List<Widget> _getListData() {
    List<Widget> list = new List();
    for(var i=0; i< 2000; i ++) {
      list.add(
        Container(
          alignment: Alignment.center,
          color:Colors.orange,
          child: Text('這是第${i}個(gè)盒子',
            textAlign: TextAlign.center,
          ),
        )
      );
    }
    return list;
  }
  Widget build(BuildContext context) {
    return GridView.count(
      padding: EdgeInsets.all(16), //- 距離頁面邊框的寬度
      crossAxisSpacing: 20.0, //- 水平子Widget 之間間距
      mainAxisSpacing: 20.0, //- 垂直子Widget 之間間距
      crossAxisCount: 4, //- 一行的Widget 數(shù)量
      children: _getListData(),
    );
  }
}

頁面展現(xiàn):


image.png

下面我們模擬一個(gè)真實(shí)的列表數(shù)據(jù)渲染到頁面上注意的知識(shí)點(diǎn):
1.Column 豎向布局方式
豎向布局雖然能夠像html一樣,豎向進(jìn)行布局,但是這里采用的網(wǎng)格布局會(huì)限制成一個(gè)正方形,如果圖片是長方形,會(huì)被拆切,所以需要用到childAspectRatio控制比例,豎向長方形進(jìn)行顯示
2.toList()
此處我們采用是模擬數(shù)據(jù),通過map方法便利之后,獲得的數(shù)據(jù)格式為:('****','****').所以我們要最后返回的時(shí)候調(diào)用toList()方法,才能夠正確返回一個(gè)List
3.SizedBox
由于Text組件沒有padding和margin屬性,所以文字的上方,我們可以使用SizedBox組件撐開一定高度
4.decoration: BoxDecoration()
Container修飾功能,可以對(duì)Container添加很多屬性,例如border邊框
先把頁面效果展示一下

image.png

代碼如下:

import "package:flutter/material.dart";
import 'src/datalist.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Container(
      child: MaterialApp(
        title: 'belineApp',
        home: Scaffold(
          appBar: AppBar(
            title: Text('my app'),
          ),
          body: StateList()
        )
      )
    );
  }
}
class StateList extends StatelessWidget {
  @override
  List<Widget> _getListData() {
    List<Widget> list = new List();
    var tempList = dataList.map((val) {
      return Container(
        child: Column (
          children: <Widget>[
            Image.network(val['picUrl']),
            SizedBox(height: 10),   //- Text組件是沒有padding和margin屬性的,所以可以使用SizedBox把文本頂下來
            Text(
              val['title'],
              textAlign: TextAlign.center, //- 文字居中
              style: TextStyle(  //- 設(shè)置樣式
                fontSize: 14
              )
            )
          ],
        ),
        decoration: BoxDecoration( //- 修飾Container
          border: Border.all(   //- 設(shè)置邊框
            color:Color.fromRGBO(233, 233, 233, 0.9),
            width: 1
          )
        ),
      );
    });
    return tempList.toList();
  }
  Widget build(BuildContext context) {
    return GridView.count(
      padding: EdgeInsets.all(16), //- 距離頁面邊框的寬度
      crossAxisSpacing: 20.0, //- 水平子Widget 之間間距
      mainAxisSpacing: 20.0, //- 垂直子Widget 之間間距
      crossAxisCount: 2, //- 一行的Widget 數(shù)量,
      childAspectRatio: 0.6,  //- 設(shè)置寬度和高度的比例
      children: _getListData(),
    );
  }
}

GridView.builder 動(dòng)態(tài)網(wǎng)格布局

  • 使用動(dòng)態(tài)網(wǎng)格布局,GridView.builder下的itemBuilder需要通過訪問下文context自動(dòng)遍歷數(shù)組內(nèi)容,返回值要求是一個(gè)Widget所以,我們的_getListData函數(shù)無需再次遍歷數(shù)組,只需要通過傳入的index渲染對(duì)應(yīng)的數(shù)據(jù),返回一個(gè)Widget即可.
  • 通過itemCount屬性設(shè)置顯示的條數(shù)
  • GridView.builder是不能直接設(shè)置間距以及比例和一行的數(shù)量的,需要通過調(diào)用gridDelegate: SliverGridDelegateWithFixedCrossAxisCount()進(jìn)行配置.
    最后呈現(xiàn)的效果如下:
    image.png

代碼內(nèi)容:

import "package:flutter/material.dart";
import 'src/datalist.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Container(
      child: MaterialApp(
        title: 'belineApp',
        home: Scaffold(
          appBar: AppBar(
            title: Text('my app'),
          ),
          body: StateList()
        )
      )
    );
  }
}
class StateList extends StatelessWidget {
  Widget _getListData(context, index) {
    return Container(
        child: Column (
          children: <Widget>[
            Image.network(dataList[index]['picUrl']),
            SizedBox(height: 10),   //- Text組件是沒有padding和margin屬性的,所以可以使用SizedBox把文本頂下來
            Text(
              dataList[index]['title'],
              textAlign: TextAlign.center, //- 文字居中
              style: TextStyle(  //- 設(shè)置樣式
                fontSize: 14
              )
            )
          ],
        ),
        decoration: BoxDecoration( //- 修飾Container
          border: Border.all(   //- 設(shè)置邊框
            color:Color.fromRGBO(233, 233, 233, 0.9),
            width: 1
          )
        ),
      );
  }
  Widget build(BuildContext context) {
    return GridView.builder(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisSpacing: 20.0, //- 水平子Widget 之間間距
        mainAxisSpacing: 20.0, //- 垂直子Widget 之間間距
        crossAxisCount: 2, //- 一行的Widget 數(shù)量,
        childAspectRatio: 0.65,  //- 設(shè)置寬度和高度的比例
      ),
      itemCount: dataList.length,
      itemBuilder: _getListData
    );
  }
}

這樣兩種方式就介紹完了.下面提供頁面中使用的引入數(shù)據(jù):datalist.dart

List dataList= [
  {
    'id': 1,
    'title': '逃離比勒陀利亞 BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/c7fdf27814c2968a48afeee047cc6cf1.jpg'
  },
  {
    'id': 2,
    'title': '公子多情 BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/253a5b3fb4cee46f8410627c0e57d74c.jpg'
  },
  {
    'id': 3,
    'title': '布娃娃 BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/489f4fa35ad58fb414c3bae1bc071d47.jpg'
  },
  {
    'id': 4,
    'title': '新咒怨(美版) BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/68ee6e7c4415c2f1f14d54b93a623ce2.jpg'
  },
  {
    'id': 5,
    'title': '勇敢者游戲2:再戰(zhàn)巔峰 BD',
    'picUrl': 'https://maopu.tv/d/thumb/0fe2c0e536079bcdcebc10e1e4c05685.jpg'
  },
  {
    'id': 6,
    'title': '1917:逆戰(zhàn)救兵 BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/224759a75c7ee82d16ae13f274beef67.jpg'
  },
  {
    'id': 7,
    'title': '漫畫威龍之大話特務(wù) BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/8694144414306752f759c0d30bfd0323.jpg'
  },
  {
    'id': 8,
    'title': '霹靂嬌娃 BD高清',
    'picUrl': 'https://maopu.tv/d/thumb/5c9f6f0c74681e0c9fc7408d9193f30a.jpg'
  },
];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缭裆,隨后出現(xiàn)的幾起案子罢缸,更是在濱河造成了極大的恐慌爹耗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碴卧,死亡現(xiàn)場(chǎng)離奇詭異竹握,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)邀跃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙紫,“玉大人,你說我怎么就攤上這事途戒】痈担” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵喷斋,是天一觀的道長唁毒。 經(jīng)常有香客問我,道長星爪,這世上最難降的妖魔是什么浆西? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮顽腾,結(jié)果婚禮上近零,老公的妹妹穿的比我還像新娘。我一直安慰自己抄肖,他們只是感情好久信,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漓摩,像睡著了一般裙士。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上管毙,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天腿椎,我揣著相機(jī)與錄音桌硫,去河邊找鬼。 笑死啃炸,一個(gè)胖子當(dāng)著我的面吹牛鞍泉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肮帐,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咖驮,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了训枢?” 一聲冷哼從身側(cè)響起托修,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恒界,沒想到半個(gè)月后睦刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡十酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年涩拙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸采。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兴泥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虾宇,到底是詐尸還是另有隱情搓彻,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布嘱朽,位于F島的核電站旭贬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搪泳。R本人自食惡果不足惜稀轨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岸军。 院中可真熱鬧奋刽,春花似錦、人聲如沸凛膏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猖毫。三九已至台谍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吁断,已是汗流浹背趁蕊。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工坞生, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掷伙。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓是己,卻偏偏與公主長得像,于是被迫代替她去往敵國和親任柜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卒废,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 編寫代碼GridView網(wǎng)格布局用了BaseAdapter基礎(chǔ)適配器 新建一個(gè)java自動(dòng)生成xml 主java里...
    開心的小哈閱讀 1,425評(píng)論 0 0
  • GridView.count使用 關(guān)鍵代碼 效果圖
    StevenHu_Sir閱讀 417評(píng)論 1 4
  • 前言 本文的目的是為了讓讀者掌握不同布局類Widget的布局特點(diǎn),分享一些在實(shí)際使用過程遇到的一些問題宙地,在《Flu...
    xqqlv閱讀 5,257評(píng)論 0 18
  • 本文對(duì)Flutter的29種布局控件進(jìn)行了總結(jié)分類摔认,講解一些布局上的優(yōu)化策略,以及面對(duì)具體的布局時(shí)宅粥,如何去選擇控件...
    chilim閱讀 1,301評(píng)論 0 19
  • 不知不覺已臨近十一月末了参袱,比起往年,今年的溫度還算是較暖和秽梅。一大早起來抹蚀,沒有陽光,陰沉沉的天企垦,似乎快要下雨了...
    TIFFANY小姐閱讀 390評(píng)論 0 0