Flutter下拉刷新的基本實(shí)現(xiàn)方式

下拉刷新算是移動(dòng)端最基本要掌握的知識(shí)了,那么flutter中還不會(huì)實(shí)現(xiàn)丑瞧,或者在學(xué)習(xí)flutter的兄弟們趾痘,或者學(xué)習(xí)中翻車的兄弟擎颖,現(xiàn)在就準(zhǔn)備上車了

實(shí)現(xiàn)效果

準(zhǔn)備材料
1,示例接口(可用)

import 'http_manager.dart';

class Api {
  static const String baseUrl = "http://interview.jbangit.com/";
 
  static const String NEWS_LIST = "news?page=";

 
  static getNewsList(int page) async {
    return HttpManager.getInstance().request('$NEWS_LIST$page');
  }
}

2,json格式化工具观游,這個(gè)百度下jsonToDartBeanAction插件搂捧,操作過于簡(jiǎn)單就不說了,在解析Json數(shù)據(jù)會(huì)用到

下面準(zhǔn)備開車

image.png

首先按常理地去理解下面幾個(gè)思路
一懂缕,頁(yè)面狀態(tài)分析和顯示
1允跑,首次加載時(shí)候的狀態(tài)
2,加載后的狀態(tài)
3搪柑,加載完成后的狀態(tài)(這里包括接口返回的各種狀態(tài)聋丝,例如沒網(wǎng)絡(luò))
4,下拉刷新時(shí)的狀態(tài)

當(dāng)然還有心細(xì)的朋友會(huì)覺得這里還有其他狀態(tài)工碾,這個(gè)就一一細(xì)分了弱睦,主要把這里主要把實(shí)現(xiàn)的方式和結(jié)果展示,先實(shí)現(xiàn)出來增強(qiáng)信心先渊额,剩下的再慢慢細(xì)化去優(yōu)化况木,后續(xù)會(huì)有優(yōu)化版下拉刷新。

二旬迹,listview的運(yùn)用還有簡(jiǎn)單的布局運(yùn)用
1火惊,首先理解下flutter加載布局和數(shù)據(jù)刷新方法
2,布局控件的使用 這個(gè)自己去敲(手在你身上)
3奔垦,網(wǎng)絡(luò)請(qǐng)求的簡(jiǎn)單使用

三屹耐,上代碼

import 'dart:convert' as convert;

import 'package:flutter/material.dart';
import 'package:flutterhaha/http/api.dart';
import 'package:flutterhaha/untils/log.dart';

import 'list_new.dart';

class PulltorefreshPage2 extends StatefulWidget {
  PulltorefreshPage2({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _PulltorefreshPageState createState() => new _PulltorefreshPageState();
}

class _PulltorefreshPageState extends State<PulltorefreshPage2> {
  ///數(shù)據(jù)列表
  List list = new List();

  ///滑動(dòng)控制器
  ScrollController _scrollController = new ScrollController();

  ///加載的頁(yè)數(shù)
  int curPage = 1;

  ///是否正在加載數(shù)據(jù)
  bool isLoading = false;

  ///初始化數(shù)據(jù)
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    getDtate(); //首次獲取數(shù)據(jù)
    _scrollController.addListener(() {
      if (_scrollController.position.pixels ==
          _scrollController.position.maxScrollExtent) {
        print('滑動(dòng)到了最底部');
        getDtate(); //上拉加載更多
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    return new Scaffold(
      appBar: new AppBar(
        title: new Text('下拉刷新'),
      ),
      body: RefreshIndicator(
        onRefresh: _onRefresh,


        ///刷新時(shí)執(zhí)行這個(gè)方法
        child: ListView.builder(
          itemBuilder:(context, i) => _buildItem(i),
          itemCount: list.length,
          controller: _scrollController,
        ),
      ),
    );
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  getDtate([bool update = true]) async {
    var data = await Api.getNewsList(curPage);

    print(convert.jsonEncode(data));
//    UntilsLogss.e(data);

    if (data != null) {
      var datas = data['data'];
//
//      ///文章總數(shù)
//      totalCount = map["pageCount"];
//
      if (curPage == 1) {
        list.clear();
      }
      curPage++;
      setState(() {
        list.addAll(datas);

      });
    }
  }

  Future<void> _onRefresh() async {
    curPage = 1;

    ///創(chuàng)建一個(gè)都完成后的新的Future
    Iterable<Future> futures = [getDtate()];
    await Future.wait(futures);

    setState(() {});
    return null;
  }

  Widget _buildItem(int i) {

    var itemData = list[i];
    return new NewItem(itemData);
  }
}

其中item布局的代碼

import 'package:flutter/material.dart';

class NewItem extends StatelessWidget {
  final itemData;

  const NewItem(this.itemData);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    Column column = new Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        new Text(itemData['title'], style: new TextStyle(fontSize: 16.0))
      ],
    );
    Row row = new Row(

      children: <Widget>[
        new Expanded(child:new Text( itemData['desc'],
          maxLines: 3,
          overflow: TextOverflow.ellipsis,)),
//        new Text(
//          itemData['desc'],
//          maxLines: 3,
//          overflow: TextOverflow.ellipsis,
//        ),
        new Image(
          image: NetworkImage(
            itemData['image'],),
          width: 100.0,
        )

      ],
    );
    return new Card(
      elevation: 4.0,
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          column,
          row,
        ],
      ),
    );
  }

}

認(rèn)真看下上面的東西基本可以理解這整個(gè)過程了,對(duì)于入門的朋友們椿猎,尤其是剛從Android的那邊過來的兄弟應(yīng)該一看就會(huì)了惶岭,畢竟我也加了不少的注釋在上面》该撸可能有些朋友還沒下載Json解析插件的俗他,在這里我也是直接解析出來。

看到這里的證明也上車了阔逼,有啥不懂 歡迎留言交流兆衅,準(zhǔn)備下一趟了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羡亩,更是在濱河造成了極大的恐慌摩疑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畏铆,死亡現(xiàn)場(chǎng)離奇詭異雷袋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辞居,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門楷怒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓦灶,你說我怎么就攤上這事鸠删。” “怎么了贼陶?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵刃泡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我碉怔,道長(zhǎng)烘贴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任撮胧,我火速辦了婚禮桨踪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芹啥。我一直安慰自己馒闷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布叁征。 她就那樣靜靜地躺著纳账,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捺疼。 梳的紋絲不亂的頭發(fā)上疏虫,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音啤呼,去河邊找鬼卧秘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛官扣,可吹牛的內(nèi)容都是我干的翅敌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惕蹄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蚯涮!你這毒婦竟也來了治专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤遭顶,失蹤者是張志新(化名)和其女友劉穎张峰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棒旗,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喘批,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铣揉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饶深。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逛拱,靈堂內(nèi)的尸體忽然破棺而出敌厘,到底是詐尸還是另有隱情,我是刑警寧澤橘券,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布额湘,位于F島的核電站卿吐,受9級(jí)特大地震影響旁舰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗡官,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一箭窜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衍腥,春花似錦磺樱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至尚骄,卻和暖如春块差,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔丈。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工憨闰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人需五。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓鹉动,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宏邮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泽示,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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