成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

flutter實(shí)戰(zhàn)3:解析HTTP請(qǐng)求數(shù)據(jù)和制作新聞分類列表

BicycleWarrior / 2525人閱讀

摘要:當(dāng)我們搭建好了整個(gè)的頁(yè)面框架,現(xiàn)在我往頁(yè)里加點(diǎn)東西各種分類的新聞列表。由于需要請(qǐng)求外部數(shù)據(jù),因此引入一個(gè)較為方便的庫(kù)。于是乎,在初始化對(duì)象時(shí)發(fā)起請(qǐng)求應(yīng)該是個(gè)不錯(cuò)的辦法具體是怎么初始化數(shù)據(jù)的,第三步會(huì)講到,踩了不少坑。

當(dāng)我們搭建好了整個(gè)APP的頁(yè)面框架,現(xiàn)在我往Tab頁(yè)里加點(diǎn)東西:各種分類的新聞列表。也可以參考我的Git,上面有要點(diǎn)注釋。

由于需要請(qǐng)求外部數(shù)據(jù),因此引入一個(gè)較為方便的http庫(kù)。官方示例的httpClient也是可以的,但是坑略多,待會(huì)兒講。

第一步

調(diào)整代碼結(jié)構(gòu),定義一個(gè)Tab頁(yè)內(nèi)通用的列表對(duì)象,這種場(chǎng)景下使用ListView.builder()創(chuàng)建不定長(zhǎng)度的列表:

//因?yàn)榱斜淼拈L(zhǎng)度不定,因此需要用有狀態(tài)類來承載列表
class NewsList extends StatefulWidget{
  final String newsType;    //新聞?lì)愋?  @override
  NewsList({Key key, this.newsType} ):super(key:key);

  _NewsListState createState() => new _NewsListState();
}

class _NewsListState extends State{
  ...
  @override
  Widget build(BuildContext context){
    return new ListView.builder(        //ListView.builder非常適合用于創(chuàng)建不確定長(zhǎng)度的的列表
        padding: const EdgeInsets.all(16.0),
        itemCount: data == null ? 0 : data.length,
        itemBuilder: (context, i) {
          return _newsRow(data[i]);//把數(shù)據(jù)項(xiàng)塞入ListView中
        }
      );
  }
  ...
}

Tab頁(yè)的數(shù)據(jù)表達(dá)進(jìn)行結(jié)構(gòu)化處理,在最外層定義新聞Tab頁(yè)的類,方便后面使用:

//定義TAB頁(yè)對(duì)象,這樣做的好處就是,可以靈活定義每個(gè)tab頁(yè)用到的對(duì)象,可結(jié)合Iterable對(duì)象使用,以后講
class NewsTab {
  String text;
  NewsList newsList;
  NewsTab(this.text,this.newsList);
}

_MyTabbedPageState對(duì)象中實(shí)例化這些Tab:

//將每個(gè)Tab頁(yè)都結(jié)構(gòu)化處理下,由于http的請(qǐng)求需要傳入新聞?lì)愋偷膮?shù)newsType,因此將新聞?lì)愋蛥?shù)值作為對(duì)象屬性傳入Tab中
  final List myTabs = [
    new NewsTab("頭條",new NewsList(newsType: "toutiao")),    //拼音就是參數(shù)值
    new NewsTab("社會(huì)",new NewsList(newsType: "shehui")),
    new NewsTab("國(guó)內(nèi)",new NewsList(newsType: "guonei")),
    new NewsTab("國(guó)際",new NewsList(newsType: "guoji")),
    new NewsTab("娛樂",new NewsList(newsType: "yule")),
    new NewsTab("體育",new NewsList(newsType: "tiyu")),
    new NewsTab("軍事",new NewsList(newsType: "junshi")),
    new NewsTab("科技",new NewsList(newsType: "keji")),
    new NewsTab("財(cái)經(jīng)",new NewsList(newsType: "caijing")),
    new NewsTab("時(shí)尚",new NewsList(newsType: "shishang")),
  ];
第二步

由于重新了Tabs,原來的TabBar和TabBarView獲取對(duì)應(yīng)值的方式也發(fā)生了改變,用map+toList方法處理下:

@override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        backgroundColor: Colors.orangeAccent,
        title: new TabBar(
          controller: _tabController,
          tabs: myTabs.map((NewsTab item){      //NewsTab可以不用聲明
            return new Tab(text: item.text==null?"錯(cuò)誤":item.text);
          }).toList(),    //記住要用toList()轉(zhuǎn)換一下map的結(jié)果,否則會(huì)由于類型不匹配而報(bào)錯(cuò)
          indicatorColor: Colors.white,
          isScrollable: true,   //水平滾動(dòng)的開關(guān),開啟后Tab標(biāo)簽可自適應(yīng)寬度并可橫向拉動(dòng),并自動(dòng)從左到右排列,默認(rèn)關(guān)閉
        ),
      ),
      body: new TabBarView(
        controller: _tabController,
        children: myTabs.map((item) {
          return item.newsList; //使用參數(shù)值
        }).toList(),
      ),
    );
  }

以上對(duì)新聞頁(yè)面的結(jié)構(gòu)進(jìn)行了重構(gòu),重頭戲就是完善NewsList對(duì)象。于是乎,在初始化NewsList對(duì)象時(shí)發(fā)起HTTP請(qǐng)求應(yīng)該是個(gè)不錯(cuò)的辦法:

具體是怎么初始化數(shù)據(jù)的,第三步會(huì)講到,踩了不少坑。這里的重點(diǎn)是,F(xiàn)lutter提倡數(shù)據(jù)驅(qū)動(dòng)組件的創(chuàng)建,組件自己無法觸發(fā)動(dòng)態(tài)創(chuàng)建對(duì)象,只有通過數(shù)據(jù)綁定的方式,實(shí)現(xiàn)對(duì)象的重繪和動(dòng)態(tài)加載,原理和react類似,比如:

第三步

到了這一步,完全進(jìn)入踩坑模式。

踩坑1 http和httpclient都是IO異步操作,其內(nèi)置的請(qǐng)求函數(shù)的返回值是Future類型對(duì)象,需要提前聲明定義類型如:Future,返回值也需要await異步處理后才可以轉(zhuǎn)換成需要的數(shù)據(jù)類型:

上圖中列舉了兩種方法,建議使用下面那種,因?yàn)槿绻軓姆祷刂抵刑崛≌?qǐng)求獲取的數(shù)據(jù),即可將所有的http請(qǐng)求封裝到API文件中去,不必寫在頁(yè)面代碼中,原因大家都懂的。
注意在setState()之前有一句if(!mounted) return,因?yàn)楫惒秸?qǐng)求數(shù)據(jù)和控件的渲染是同時(shí)進(jìn)行的,如果代碼已經(jīng)執(zhí)行到了setState,但是數(shù)據(jù)還沒有獲取到,此時(shí)setState觸發(fā)的控件渲染就會(huì)報(bào)錯(cuò),為了避免這種空值錯(cuò)誤,在setState之前先判斷空間是否已經(jīng)渲染完成,mountedFlutter內(nèi)置的當(dāng)前控件的狀態(tài)標(biāo)識(shí),記住就好。

踩坑2 在ListView直屬的Column里面不能用Expanded控件

圖中的提示說使用Flexible控件更佳,然而實(shí)際上Flexible也會(huì)報(bào)錯(cuò)。報(bào)錯(cuò)的英文大概意思是ListView控件生成未知長(zhǎng)度的列表時(shí),總是會(huì)自動(dòng)壓縮每一個(gè)子元素的高度,而ExpandedFlexible都是可以自由伸縮的控件,造成ListView的子元素?zé)o法確定繪制的高度,為了使超出屏幕寬度的新聞標(biāo)題自動(dòng)換行,這個(gè)時(shí)候用ListTile頂替一下吧。

踩坑3 處理不同新聞圖片數(shù)量不一致的問題

如上圖,肯定是不行的,控件的子元素是不允許為空的,于是使用條件判斷的方式封裝一下:

踩坑3 深刻體會(huì)map數(shù)組和Object數(shù)組的使用,newsinfo.["title"]newsinfo.title兩者的newsinfo類型是不一樣的,詳細(xì)還是到源碼中去體會(huì)吧,注意對(duì)比newsinfomyTab這兩個(gè)的用法。

這次頁(yè)面寫的非常辛苦,而且還沒實(shí)現(xiàn)滾動(dòng)刷新或頂部下拉刷新的效果,下一篇再更吧,還有很多要點(diǎn)我在源碼中有標(biāo)識(shí),可以去我的Git中慢慢品味,今天就更到這里,滾去睡覺,真的來不起了。

感謝大家的支持,請(qǐng)關(guān)注我的Flutter圈子,多多投稿,也可以加入flutter 中文社區(qū)(官方QQ群:338252156)共同成長(zhǎng),謝謝大家~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/93920.html

相關(guān)文章

  • flutter實(shí)戰(zhàn)4:新聞列表的懶加載下拉手勢(shì)刷新

    摘要:上一篇我們實(shí)現(xiàn)了新聞列表,但在網(wǎng)絡(luò)不好的時(shí)候列表會(huì)白屏,因此為了提高使用體驗(yàn),往列表中加入懶加載效果。其次,引入一個(gè)內(nèi)置的手勢(shì)控件,用于支持下拉刷新列表的效果如下圖將異步執(zhí)行也進(jìn)行了控件化處理,即。 上一篇我們實(shí)現(xiàn)了新聞列表,但在網(wǎng)絡(luò)不好的時(shí)候列表會(huì)白屏,因此為了提高使用體驗(yàn),往列表中加入懶加載效果。其次,引入一個(gè)Flutter內(nèi)置的手勢(shì)控件,用于支持下拉刷新列表的效果如下圖: sho...

    AlienZHOU 評(píng)論0 收藏0
  • 高級(jí)架構(gòu)師實(shí)戰(zhàn):如何用最小的代價(jià)完成爬蟲需求

    摘要:在系統(tǒng)正常運(yùn)行時(shí),可以變更爬蟲的配置,一旦實(shí)時(shí)監(jiān)控爬蟲出現(xiàn)異常,可實(shí)時(shí)修正配置進(jìn)行干預(yù)。從數(shù)據(jù)庫(kù)中實(shí)時(shí)讀取配置信息,響應(yīng)業(yè)務(wù)層的配置請(qǐng)求。處理系統(tǒng)通過服務(wù)層,每次去取配置信息可能維護(hù)人員在實(shí)時(shí)修正及待抓取的列表進(jìn)行處理。 showImg(https://segmentfault.com/img/bVLa4V?w=960&h=540); 一 ?緣起 在我工作的多家公司,有眾多的領(lǐng)域,如房...

    light 評(píng)論0 收藏0
  • Flutter 專題】15 圖解 ListView 異步加載數(shù)據(jù)與等待 #yyds干貨盤點(diǎn)#

    摘要:小菜前兩天再學(xué)時(shí),整理了一下在列表中展示多種不同樣式,今天繼續(xù)深入學(xué)習(xí)異步請(qǐng)求數(shù)據(jù)并加載新聞列表以及初始進(jìn)入頁(yè)面的等小知識(shí)點(diǎn)。小菜剛接觸時(shí)間不長(zhǎng),還有很多不清楚和不理解的地方,如果又不對(duì)的地方還希望多多指出。 小菜前兩天再學(xué) ListView 時(shí),整理了一下在列表中展示多種不同 item 樣式,今天繼續(xù)深入學(xué)習(xí)...

    番茄西紅柿 評(píng)論0 收藏2637
  • 性能優(yōu)化全新思路!實(shí)踐騰訊、字節(jié)、阿里、百度、網(wǎng)易等互聯(lián)網(wǎng)公司項(xiàng)目實(shí)戰(zhàn)+案例分析(附PDF源碼)

    摘要:不努力不奮斗,可能就會(huì)在基層一輩子止步不前。不過,只一句,如果你還在做這一行,還是一名程序猿媛,想走上坡路的你,也許我這到手的十幾家一線互聯(lián)網(wǎng)公司性能優(yōu)化項(xiàng)目實(shí)戰(zhàn)可能會(huì)對(duì)你有所幫助。 ...

    ytwman 評(píng)論0 收藏0
  • Android程序員完全沒時(shí)間提升自己怎么辦?

    摘要:昨天有個(gè)小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點(diǎn)后悔選擇開發(fā)了,月月光不說,還加班特別嚴(yán)重,平時(shí)也沒有屬于自己的時(shí)間去學(xué)習(xí),問我剛畢業(yè)的時(shí)候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒有其他時(shí)間提升自己的技術(shù)。 昨天有個(gè)小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點(diǎn)后悔選擇Android開發(fā)了,月月光不說...

    kohoh_ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<