Flutter(33):Material組件之ListTile、RefreshIndicator洞慎、ListView痛单、Divider

Flutter教學(xué)目錄持續(xù)更新中

Github源代碼持續(xù)更新中

1.簡(jiǎn)介

這一節(jié)呢這三個(gè)組件一起來(lái)介紹

  • ListTile:一個(gè)文本組件,跟之前介紹的SwitchListTile劲腿、RadioListTile旭绒、CheckboxListTile相似,傳送門:Flutter教學(xué)目錄
  • RefreshIndicator:下拉刷新組件
  • ListView:列表
  • Divider:分割線

2.ListTile屬性

  • leading:頭部widget
  • title:標(biāo)題
  • subtitle:副標(biāo)題
  • trailing:尾部widget
  • dense:
  • shape:形狀
  • contentPadding:內(nèi)邊距
  • enabled = true:是否可用,false會(huì)屏蔽點(diǎn)擊長(zhǎng)按事件,然后置灰
  • onTap:點(diǎn)擊事件
  • onLongPress:長(zhǎng)按事件
  • selected = false:是否選中,true的話會(huì)展示主題色調(diào)


    enabled = false.png
selected = false.png
selected = true.png
_myListTitle() {
  return ListTile(
    leading: Icon(Icons.account_circle),
    title: Text('title'),
    subtitle: Text('subtitle'),
    trailing: Icon(Icons.account_box),
    dense: false,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(5),
    ),
    contentPadding: EdgeInsets.all(10),
    enabled: true,
    onTap: () {
      ToastUtil.showToast('onTap');
    },
    onLongPress: () {
      ToastUtil.showToast('onLongPress');
    },
    selected: true,
  );
}

3.RefreshIndicator屬性

  • child:子widget
  • displacement = 40.0:觸發(fā)下拉刷新的距離
  • onRefresh:刷新事件
  • color:顏色
  • backgroundColor:背景色
  • strokeWidth = 2.0: 寬度
1601720169(1).png
_myRefreshIndicator() {
  return RefreshIndicator(
    child: _myListView(),
    displacement: 40,
    onRefresh: () {
      ToastUtil.showToast('onRefresh');
      return _onRefresh();
    },
    color: Colors.blue,
    backgroundColor: Colors.white,
    strokeWidth: 2,
  );
}
_onRefresh() async {
  await Future.delayed(Duration(seconds: 3), () {
    setState(() {});
  });
}

4.ListView

ListView的創(chuàng)建方式有多種:

  • ListView()
  • ListView.builder()
  • ListView.separated()
  • ListView.custom()

4.1ListView()

這種是最簡(jiǎn)單基礎(chǔ)的方式,子節(jié)點(diǎn)是返回widgets

  • scrollDirection = Axis.vertical:方向
  • reverse = false:是否反轉(zhuǎn),為true的話排列會(huì)反向,下拉刷新也會(huì)變成上拉刷新
  • ScrollController controller:控制器
  • primary:當(dāng)內(nèi)容不足以滾動(dòng)時(shí)快压,是否支持滾動(dòng);true:用來(lái)解決listView不滿一頁(yè)無(wú)法觸發(fā)下拉刷新垃瞧,需要注意這個(gè)時(shí)候不可以設(shè)置controller
  • physics:控制用戶滾動(dòng)視圖的交互蔫劣,可以提供邊界回彈特效
    • AlwaysScrollableScrollPhysics:列表總是可滾動(dòng)的。在iOS上會(huì)有回彈效果个从,在android上不會(huì)回彈脉幢。那么問(wèn)題來(lái)了,如果primary設(shè)置為false(內(nèi)容不足時(shí)不滾動(dòng))嗦锐,且 physics設(shè)置為AlwaysScrollableScrollPhysics嫌松,列表是否可以滑動(dòng)?答案是可以奕污,感興趣的可以試一下
    • PageScrollPhysics:一般是給PageView控件用的滑動(dòng)效果。如果listview設(shè)置的話在滑動(dòng)到末尾時(shí)會(huì)有個(gè)比較大的彈起和回彈
    • ClampingScrollPhysics:滾動(dòng)時(shí)沒有回彈效果,同android系統(tǒng)的listview效果
    • NeverScrollableScrollPhysics:就算內(nèi)容超過(guò)列表范圍也不會(huì)滑動(dòng)
    • BouncingScrollPhysics:不論什么平臺(tái)都會(huì)有回彈效果
  • shrinkWrap = false:false:則高度為滑動(dòng)方向上的最大允許高度焕议;如果在滑動(dòng)方向上沒有設(shè)置約束逮京,則這個(gè)字段必須設(shè)置為true,否則會(huì)報(bào)錯(cuò)嘱根。簡(jiǎn)而言之就是父節(jié)點(diǎn)為滑動(dòng)組件的時(shí)候,且滑動(dòng)方向一致需要true髓废,例如:SingleChildScrollView
  • padding:內(nèi)邊距
  • itemExtent:指定Item在滑動(dòng)方向上的高度,用來(lái)提高滑動(dòng)性能
  • addAutomaticKeepAlives = true:是否將子控件包裹在AutomaticKeepAlive控件內(nèi)
  • addRepaintBoundaries = true:是否將子控件包裹在 RepaintBoundary 控件內(nèi)该抒。用于避免列表滾動(dòng)時(shí)的重繪慌洪,如果子控件重繪開銷很小時(shí),比如子控件就是個(gè)色塊或簡(jiǎn)短的文字凑保,把這個(gè)字段設(shè)置為false性能會(huì)更好
  • addSemanticIndexes = true:是否把子控件包裝在IndexedSemantics里冈爹,用來(lái)提供無(wú)障礙語(yǔ)義
  • cacheExtent:可見區(qū)域的前后會(huì)有一定高度的空間去緩存子控件,當(dāng)滑動(dòng)時(shí)就可以迅速呈現(xiàn)
  • children = const <Widget>[]:
  • semanticChildCount:語(yǔ)義item數(shù)量


    1601725095(1).png
_getListWidgets() {
    for (var i = 0; i < 10; i++) {
      _widgetList.add(_myListTitle());
    }
    return _widgetList;
  }

  _myListView() {
    return ListView(
      scrollDirection: Axis.vertical,
      reverse: false,
      controller: null,
      primary: false,
      itemExtent: 60,
      cacheExtent: 60,
      padding: EdgeInsets.all(10),
      children: _getListWidgets(),
    );
  }

4.2ListView.builder()

跟ListView()創(chuàng)建方式區(qū)別不大愉适,主要是子節(jié)點(diǎn)屬性變了犯助,itemBuilder返回子節(jié)點(diǎn),itemCount確定子節(jié)點(diǎn)數(shù)量

  • itemBuilder:IndexedWidgetBuilder item
  • itemCount:item數(shù)量


    1601725095(1).png
_myListViewBuild() {
    return ListView.builder(
      scrollDirection: Axis.vertical,
      reverse: false,
      controller: null,
      primary: false,
      itemExtent: 60,
      cacheExtent: 60,
      padding: EdgeInsets.all(10),
      itemBuilder: (BuildContext context, int index) {
        return _myListTitle();
      },
      itemCount: _widgetList.length,
    );
  }

4.3ListView.separated()

這個(gè)是可以設(shè)置分割線的维咸,那么我們就先了解一下fluter里面的分割線組件
Divider剂买、VerticalDivider、PopupMenuDivider
前面兩個(gè)的屬性是一樣的癌蓖,只是一個(gè)橫向一個(gè)縱向瞬哼,后面一個(gè)是看名字也知道,給PopupMenu用的租副,當(dāng)然用在ListView其實(shí)也是可以的坐慰,但是他只有一個(gè)height屬性

  • height:高度,這個(gè)高度不是Divider設(shè)置高度,不是里面的線高度
  • thicknes:這個(gè)才是線高度
  • indent:開始縮進(jìn)
  • endInden:末尾縮進(jìn)
  • color:顏色
進(jìn)入正題:

這個(gè)就是在ListView.builder()基礎(chǔ)上多了分割線屬性

  • itemBuilder:IndexedWidgetBuilder item
  • separatorBuilder:分割線
  • itemCount:item數(shù)量


    1601733619(1).png
  _myListViewSeparated() {
    return ListView.separated(
      primary: true,
      itemBuilder: (BuildContext context, int index) => _myListTitle(),
      separatorBuilder: (BuildContext context, int index) {
        return Divider(
          height: 1,
          thickness: 1,
          indent: 10,
          endIndent: 10,
        );
        return Container(
          child: Text('----分割線----'),
          color: Colors.grey,
        );
      },
      itemCount: _widgetList.length,
    );
  }

4.4ListView.custom()

  • childrenDelegate:SliverChildDelegate
  • findChildIndexCallback:
  • childCount:
    這個(gè)是比較高階的用法了,可以自己去實(shí)現(xiàn)子控件的復(fù)用重繪用僧,位置返回等自定義操作了结胀,這個(gè)比較復(fù)雜赞咙,需要對(duì)源碼有一定了解基礎(chǔ)再來(lái)看,這個(gè)后期會(huì)在進(jìn)階或者深入解讀里面再做介紹糟港,這里做個(gè)了解


    1601735732(1).png
  _myListViewCustom() {
    return ListView.custom(
      childrenDelegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return _myListTitle();
        },
        childCount: _widgetList.length,
        findChildIndexCallback: (key){
          print('key = $key');
          return 0;
        }
      ),
    );
  }

下一節(jié):Material組件之ExpansionPanelList攀操、ExpansionPanel、ExpansionPanelRadio秸抚、ExpansionTile

Flutter(34):Material組件之ExpansionPanelList速和、ExpansionPanel、ExpansionPanelRadio剥汤、ExpansionTile

Flutter教學(xué)目錄持續(xù)更新中

Github源代碼持續(xù)更新中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颠放,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吭敢,更是在濱河造成了極大的恐慌碰凶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹿驼,死亡現(xiàn)場(chǎng)離奇詭異痒留,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蠢沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伸头,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人舷蟀,你說(shuō)我怎么就攤上這事恤磷。” “怎么了野宜?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵扫步,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我匈子,道長(zhǎng)河胎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任虎敦,我火速辦了婚禮游岳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘其徙。我一直安慰自己胚迫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布唾那。 她就那樣靜靜地躺著访锻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上期犬,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天河哑,我揣著相機(jī)與錄音,去河邊找鬼龟虎。 笑死灾馒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遣总。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼轨功,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旭斥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起古涧,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤垂券,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后羡滑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菇爪,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柒昏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凳宙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡职祷,死狀恐怖氏涩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情有梆,我是刑警寧澤是尖,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泥耀,受9級(jí)特大地震影響饺汹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痰催,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一兜辞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夸溶,春花似錦弦疮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春啸罢,著一層夾襖步出監(jiān)牢的瞬間编检,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工扰才, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允懂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓衩匣,卻偏偏與公主長(zhǎng)得像蕾总,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琅捏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355