Flutter系列(五)《列表下拉刷新和上拉加載》

引言

  • 有列表使用的地方就會(huì)并存會(huì)用到刷新加載功能巴碗,今天帶大家一起來(lái)學(xué)習(xí)一下。

1即寒、下拉加載

  • 我們通過(guò)使用RefreshIndicator組件來(lái)實(shí)現(xiàn)下拉刷新功能橡淆,首先我們來(lái)看下RefreshIndicator組件有哪些屬性
const RefreshIndicator({
    Key key,
    @required this.child,
    this.displacement = 40.0,
    @required this.onRefresh,
    this.color,
    this.backgroundColor,
    this.notificationPredicate = defaultScrollNotificationPredicate,
    this.semanticsLabel,
    this.semanticsValue,
  })
  • 如何使用

使用RefreshIndicator外層包裹List即可,onRefresh是下拉刷新觸發(fā)的時(shí)間監(jiān)聽母赵,至此下拉刷新就簡(jiǎn)單的實(shí)現(xiàn)了

body: Center(
        child: Container(
          child: RefreshIndicator(
            onRefresh: _loadNewData,
              child: ListView(
                controller: _scrollController,
                children: _buildList(),
              ),
          ),
        ),
      ),

  Future<void> _loadNewData() async{
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      cityList = CITY_NAMES;
    });
    return Null;
  }

2逸爵、上拉加載

  • 上拉加載需要用到對(duì)列表的滾動(dòng)監(jiān)聽,這時(shí)需要給List綁定一個(gè)ScrollController凹嘲,在這之前需要重寫initState和dispose方法师倔,initState不言而喻是構(gòu)造方法,dispose相當(dāng)于iOS的dealloc周蹭、Android中的onDestroy方法
  @override
  void initState() {
    // TODO: implement initState
    _scrollController.addListener(() {  //添加監(jiān)聽

      if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent){  //判斷是否滾動(dòng)到列表底部
        _loadMoreData();
        print('開始執(zhí)行');
      }
    });
    super.initState();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _scrollController.dispose();

    super.dispose();
  }



2趋艘、完整源碼

  • 下面源碼還添加了列表嵌套結(jié)合下拉刷新和上拉加載綜合使用
import 'package:flutter/material.dart';
const CITY_NAMES = ['北京','上海','廣州','深圳','杭州','武漢','廈門','東莞','九江','南昌','萍鄉(xiāng)','新余'];
const SON_CITY_NAMES = ['北京son','上海son','廣州son','深圳son','杭州son','武漢son','廈門son','東莞son','九江son','南昌son','萍鄉(xiāng)son','新余son'];
class TravelPage extends StatefulWidget {
  @override
  _TravelPageState createState() {
    // TODO: implement createState
    return _TravelPageState();
  }

}

class _TravelPageState extends State <TravelPage> {

  ScrollController _scrollController = ScrollController();
  List<String> cityList = List.from(CITY_NAMES);

  @override
  void initState() {
    // TODO: implement initState
    _scrollController.addListener(() {

      if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent){
        _loadMoreData();
        print('開始執(zhí)行');
      }
    });
    super.initState();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _scrollController.dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('List的嵌套使用'),
      ),
      body: Center(
        child: Container(
          child: RefreshIndicator(
            onRefresh: _loadNewData,
              child: ListView(
                controller: _scrollController,
                children: _buildList(),
              ),
          )
        ),
      )
      );
  }

  List<Widget> _buildList() {
    return cityList.map((city) => _item(city)).toList();
  }

  Widget _item(String city) {
    return Container(
      height: 80,
      margin: EdgeInsets.only(bottom: 5),
      alignment: Alignment.center,
      decoration: BoxDecoration(color: Colors.orange),
      child: ListView(
        scrollDirection: Axis.horizontal,
        children: _sonBuildList(),
      ),
    );
  }

  List<Widget> _sonBuildList() {
    return SON_CITY_NAMES.map((city) => _sonItem(city)).toList();
  }

  Widget _sonItem(String city) {
    return Container(
      width: 150,
      margin: EdgeInsets.only(right: 5),
      alignment: Alignment.center,
      decoration: BoxDecoration(color: Colors.green),
      child: Text(
        city,
        style: TextStyle(color: Colors.white,fontSize: 20),
      ),
    );
  }

  Future<void> _loadNewData() async{
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      cityList = CITY_NAMES;
    });
    return Null;
  }

  _loadMoreData() async {
    await Future.delayed(Duration(seconds: 1));
    setState(() {
      List tempList = List<String>.from(cityList);
      tempList.addAll(cityList);
      cityList = tempList;
      print('加載更多');
    });
  }

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疲恢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子致稀,更是在濱河造成了極大的恐慌冈闭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抖单,死亡現(xiàn)場(chǎng)離奇詭異萎攒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)矛绘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門耍休,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人货矮,你說(shuō)我怎么就攤上這事羊精。” “怎么了囚玫?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵喧锦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抓督,道長(zhǎng)燃少,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任铃在,我火速辦了婚禮阵具,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定铜。我一直安慰自己阳液,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布揣炕。 她就那樣靜靜地躺著帘皿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畸陡。 梳的紋絲不亂的頭發(fā)上矮烹,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音罩锐,去河邊找鬼。 笑死卤唉,一個(gè)胖子當(dāng)著我的面吹牛涩惑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桑驱,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼竭恬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跛蛋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起痊硕,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赊级,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后岔绸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體理逊,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盒揉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晋被。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刚盈,死狀恐怖羡洛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藕漱,我是刑警寧澤欲侮,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站肋联,受9級(jí)特大地震影響威蕉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牺蹄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一忘伞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沙兰,春花似錦氓奈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斋射,卻和暖如春育勺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罗岖。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工涧至, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桑包。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓南蓬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赘方,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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