Flutter基礎(七)Scrolling Widget之ListView鲁猩、GridView、PageView

本文首發(fā)于公眾號「后廠村碼農(nóng)」

ReactNative入門系列
React Native組件
Flutter基礎系列

前言

我們知道Widget的分類有很多種罢坝,比如:Basics廓握、Material Components、Cupertino嘁酿、Scrolling等等隙券,在前面的文章我介紹了Basics和Material Components,這一篇講一下Scrolling分類中比較常用的ListView闹司、GridView娱仔、PageView。

1 ListView

ListView可以說是Flutter中最常用的Scrolling Widget开仰。
ListView有四種構造函數(shù):

  1. 默認構造函數(shù)ListView拟枚。
  2. ListView.builder,適用于具有大量(或無限)列表項众弓。
  3. ListView.separated恩溅,可以配置分割線,適用于具有固定數(shù)量列表項的ListView谓娃。
  4. ListView.custom脚乡,提供了自定義子Widget的能力。

1.1 默認構造函數(shù)

用默認構造函數(shù)的方式來實現(xiàn)一個簡單的列表。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('ListView示例'),
        ),
        body: ListView(
          children: <Widget>[
            ListTile(
              leading: Icon(Icons.access_time),
              title: Text('第1行'),
            ),
            ListTile(
              leading: Icon(Icons.access_time),
              title: Text('第2行'),
            ),
          ],
        ),
      ),
    );
  }
}

ListTile是Material Components中的Widget奶稠,通常用于填充ListView俯艰,可以滿足基本的圖片+文字的列表需求。

VwPmwj.png

1.2 ListView.builder創(chuàng)建

如果要展示大量列表項锌订,可以使用ListView.builder竹握。

import 'package:flutter/material.dart';

void main() => runApp(MyApp(
      items: new List<String>.generate(300, (i) => "第$i行"), //1
    ));

class MyApp extends StatelessWidget {
  final List<String> items;

  MyApp({@required this.items});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('ListView示例'),
        ),
        body: ListView.builder( //2
          itemCount: items.length,
          itemBuilder: (context, index) {
            return ListTile(
              leading: Icon(Icons.access_time),
              title: Text('${items[index]}'),
            );
          },
        ),
      ),
    );
  }
}

在注釋1生成300個數(shù)據(jù),并將其傳入到MyApp中辆飘,注釋2處通過ListView.builder創(chuàng)建ListView啦辐,最終會通過ListTile來顯示每一個列表項。


VwP86U.png

1.3 ListView.separated創(chuàng)建

import 'package:flutter/material.dart';

void main() => runApp(MyApp(
      items: new List<String>.generate(300, (i) => "第$i行"), 
    ));

class MyApp extends StatelessWidget {
  final List<String> items;

  MyApp({@required this.items});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Test',
      home: Scaffold(
        appBar: AppBar(
          title: Text('ListView示例'),
        ),
        body: ListView.separated(
          itemCount: items.length,
          itemBuilder: (context, index) {
            return ListTile(
              leading: Icon(Icons.access_time),
              title: Text('${items[index]}'),
            );
          },
          separatorBuilder: (context, index) {//1
            return Container(
              constraints: BoxConstraints.tightFor(height: 1),
              color: Colors.black45,
            );
          },
        ),
      ),
    );
  }
}

這種創(chuàng)建方式和ListView.builder類似蜈项,有個最大的不同就是可以通過注釋1處的separatorBuilder來設置分割線以及分割線的樣式芹关。


VwDsxA.png

2 GridView

GridView的使用方法和ListView類似,它有五種構造函數(shù):

  1. 默認構造函數(shù)GridView紧卒。
  2. GridView.count:在橫軸方向上具有固定數(shù)量的GridView侥衬。
  3. GridView.extent:在橫軸方向上具有最大范圍的GridView。
  4. GridView.builder:適用于具有大量(或無限)列表項跑芳。
  5. GridView.custom:提供了自定義子Widget的能力轴总。

這里以第2種構造函數(shù)為例。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: new Text('GridView示例'),
        ),
        body: GridView.count(
          crossAxisCount: 3, //1
          children: <Widget>[
            ListTile(
              title: Text('item1'),
            ),
            ListTile(
              title: Text('item2'),
            ),
            ListTile(
              title: Text('item3'),
            ),
            ListTile(
              title: Text('item4'),
            ),
            ListTile(
              title: Text('item5'),
            ),
            ListTile(
              title: Text('item6'),
            ),
            ListTile(
              title: Text('item7'),
            ),
            ListTile(
              title: Text('item8'),
            ),
            ListTile(
              title: Text('item9'),
            ),
          ],
        ),
      ),
    );
  }
}

注釋1處的crossAxisCount用于設置橫軸item的數(shù)量聋亡。效果如下圖所示:


VBCOyT.png

3 PageView

PageView是一個可逐頁滾動的列表肘习,和Android中ViewPage類似际乘。
PageView有三種構造函數(shù):

  1. 默認構造函數(shù)PageView
  2. PageView.builder:適用于具有大量(或無限)列表項坡倔。
  3. PageView.custom:提供了自定義子Widget的能力。

以默認構造函數(shù)為例脖含,代碼如下所示罪塔。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: Text('PageView示例'),
        ),
        body: PageView(
          onPageChanged: (index) {//1
            print('當前為第 $index 頁');
          },
          children: <Widget>[
            ListTile(
              title: Text('第0頁'),
            ),
            ListTile(
              title: Text('第1頁'),
            ),
            ListTile(
              title: Text('第2頁'),
            ),
          ],
        ),
      ),
    );
  }
}

通過注釋1處的onPageChanged屬性可以得知當前滑動到了第幾頁。


VBk9Yj.png

總結

本文并沒有介紹每個Widget的構造函數(shù)养葵,那樣的話就不是一篇文章能寫下的了征堪,也沒有必要,我們掌握了其中一種構造函數(shù)基本就可以舉一反三了关拒。Scrolling Widget還包含了一些其他Widget佃蚜,比如:NestedScrollView、Scrollbar着绊、CustomScrollView谐算、NotificationListener等等,就需要去自行查看官方文檔了:https://flutter.dev/docs/development/ui/widgets/scrolling

更多的內(nèi)容請關注我的獨立博客的知識體系:
http://liuwangshu.cn/system/


這里不僅分享大前端归露、Android洲脂、Java等技術,還有程序員成長類文章剧包。


image
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恐锦,一起剝皮案震驚了整個濱河市往果,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌一铅,老刑警劉巖陕贮,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潘飘,居然都是意外死亡飘蚯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門福也,熙熙樓的掌柜王于貴愁眉苦臉地迎上來局骤,“玉大人,你說我怎么就攤上這事暴凑÷退Γ” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵现喳,是天一觀的道長凯傲。 經(jīng)常有香客問我,道長嗦篱,這世上最難降的妖魔是什么冰单? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮灸促,結果婚禮上诫欠,老公的妹妹穿的比我還像新娘。我一直安慰自己浴栽,他們只是感情好荒叼,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著典鸡,像睡著了一般被廓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萝玷,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天嫁乘,我揣著相機與錄音,去河邊找鬼球碉。 笑死蜓斧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的汁尺。 我是一名探鬼主播法精,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搂蜓?” 一聲冷哼從身側響起狼荞,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帮碰,沒想到半個月后相味,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡殉挽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年丰涉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斯碌。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡一死,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傻唾,到底是詐尸還是另有隱情投慈,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布冠骄,位于F島的核電站伪煤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凛辣。R本人自食惡果不足惜抱既,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扁誓。 院中可真熱鬧防泵,春花似錦、人聲如沸跋理。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽前普。三九已至,卻和暖如春壹堰,著一層夾襖步出監(jiān)牢的瞬間拭卿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工贱纠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峻厚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓谆焊,卻偏偏與公主長得像惠桃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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