Fiutter- 案例3 (推薦頁面)

前言

推薦頁面是Home頁面的一個子頁面洒放,里面會使用到Loading翎迁,列表符匾,API數(shù)據(jù)請求相關(guān)只是

Home頁面

微信圖片_20220604124922.jpg
微信圖片_20220604124927.jpg

Loading

加載框一般會出現(xiàn)在頁面請求網(wǎng)絡(luò)數(shù)據(jù)祈坠,或者進(jìn)行耗時操作害碾,對用戶的感官體驗清切對頁面也是一種保護(hù),在頁面沒有完成之前不允許用戶操作赦拘,這里我們使用了一個第三方依賴去展示loading

需要在你的pubspec.yaml文件中加入loading_indicator_view: ^1.1.0

  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2
  loading_indicator_view: ^1.1.0

然后點擊Pub get進(jìn)行依賴下載就可以正常使用了

class SuggestPageState extends State {
  List<SuggestModel> data = List.empty(growable: true);
  var isLoading = true;

  Widget getContent() {
    if (isLoading) {
      return Container(alignment: Alignment.center,child: BallPulseIndicator(ballColor: Colors.green));
    } else {
      return ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return SuggestItem(data[index]);
        },
        itemCount: data.length,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(children: [
      Expanded(flex:1,child: getContent()),
    ],);
  }
}

如果isLoadingtrue的情況下慌随,我們展示Loading,否則我們展示列表數(shù)據(jù)躺同,當(dāng)然我們需要去獲取列表數(shù)據(jù)并且在獲取到列表數(shù)據(jù)之后將isLoading設(shè)置為false

列表數(shù)據(jù)

首先我們需要創(chuàng)建一個列表的Item Widget

class SuggestItem extends StatefulWidget {
  SuggestModel data;

  SuggestItem(this.data);

  @override
  State<StatefulWidget> createState() {
    return SuggestItemState(data);
  }
}

class SuggestItemState extends State {
  SuggestModel data;

  SuggestItemState(this.data);

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
        Row(
          children: [
            Container(
              child: Padding(
                padding: EdgeInsets.all(10),
                child: Container(
                  clipBehavior: Clip.hardEdge,
                  height: 30,
                  width: 30,
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.all(Radius.circular(15))),
                  child: Image.network(
                      "https://upload.jianshu.io/users/upload_avatars/25609565/55f1d4c5-f80b-497c-946f-8ab642a2929e.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/300/format/webps"),
                ),
              ),
            ),
            Text('Mike', style: TextStyle(fontSize: 11)),
            Spacer(),
            Padding(
                padding: EdgeInsets.all(10),
                child: Icon(Icons.arrow_forward_outlined,
                    size: 15, color: Colors.grey))
          ],
        ),
        Padding(
          padding: EdgeInsets.only(left: 10),
          child: Row(
            children: [
              Container(
                padding: EdgeInsets.all(5),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.all(Radius.circular(15)),
                    color: Color(0x0f00FF00)),
                child: Row(
                  children: [
                    Icon(
                      Icons.offline_pin,
                      color: Colors.green,
                      size: 15,
                    ),
                    Padding(
                      padding: EdgeInsets.only(left: 5, right: 5),
                      child: GestureDetector(
                        onTap: () => {
                          //Jump to Topic Page
                          Navigator.pushNamed(context, '/chooseTopic')
                        },
                        child: Text(
                          '2022觀影記錄',
                          style: TextStyle(color: Colors.green, fontSize: 12),
                        ),
                      ),
                    )
                  ],
                ),
              ),
              Spacer()
            ],
          ),
        ),
        Padding(
            padding: EdgeInsets.all(10), child: Text('萬物方來阁猜,萬物方去,永遠(yuǎn)的轉(zhuǎn)著存在的輪子')),
        Padding(
          padding: EdgeInsets.only(left: 10, right: 10),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Flexible(
                flex: 1,
                child: Container(
                  height: 120,
                  clipBehavior: Clip.hardEdge,
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.only(
                          topLeft: Radius.circular(5),
                          bottomLeft: Radius.circular(5))),
                  child: Image.network(
                      "https://img1.doubanio.com/view/photo/l/public/p2624374019.webp",
                      fit: BoxFit.cover),
                ),
              ),
              Container(
                width: 5,
              ),
              Flexible(
                flex: 1,
                child: Container(
                  height: 120,
                  child: Image.network(
                      "https://img9.doubanio.com/view/photo/l/public/p2561886965.webp",
                      fit: BoxFit.cover),
                ),
              ),
              Container(
                width: 5,
              ),
              Flexible(
                fit: FlexFit.tight,
                flex: 1,
                child: Container(
                  height: 120,
                  clipBehavior: Clip.hardEdge,
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.only(
                          topRight: Radius.circular(5),
                          bottomRight: Radius.circular(5))),
                  child: Image.network(
                      "https://img1.doubanio.com/view/photo/l/public/p2612697967.webp",
                      fit: BoxFit.cover),
                ),
              )
            ],
          ),
        ),
        Container(
          padding: EdgeInsets.all(10),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Spacer(),
              Icon(
                Icons.thumb_up_alt_outlined,
                color: Colors.grey,
              ),
              Text(
                '553',
                style: TextStyle(color: Colors.grey),
              ),
              Spacer(),
              Icon(Icons.messenger_outline, color: Colors.grey),
              Text('35', style: TextStyle(color: Colors.grey)),
              Spacer(),
              Icon(Icons.folder_shared_outlined, color: Colors.grey),
              Text('36', style: TextStyle(color: Colors.grey)),
              Spacer(),
            ],
          ),
        ),
        Container(
          height: 10,
          alignment: Alignment.center,
          color: Color(0x10000000),
        )
      ]),
    );
  }
}

這里雖然有傳遞了SuggestModel但是沒有使用蹋艺,還是使用了靜態(tài)數(shù)據(jù),純粹是因為我懶....想在未來的將來補上

數(shù)據(jù)請求

添加http請求依賴

http: ^0.12.2 

SuggestPage中增加請求數(shù)據(jù)的函數(shù)

由于豆瓣API最近無法使用剃袍,所以直接call了百度達(dá)到一個異步請求的動作,然后請求完成之后構(gòu)建了假數(shù)據(jù)捎谨,并且刷新了狀態(tài)

  Future<void> getSuggestInfo() async {
    var client = http.Client();
    var response = await client.get("https://www.baidu.com");
    print(response.body);
    List<String> imgs = List.empty(growable: true);
    imgs.add("");
    imgs.add("");
    imgs.add("");
    data.add(SuggestModel(photo: "111",tab: "2022觀影記錄",message: "萬物方來,萬物方去,永遠(yuǎn)的轉(zhuǎn)著存在的輪子",imgRes: imgs));
    data.add(SuggestModel(photo: "111",tab: "2022觀影記錄",message: "萬物方來,萬物方去,永遠(yuǎn)的轉(zhuǎn)著存在的輪子",imgRes: imgs));
    data.add(SuggestModel(photo: "111",tab: "2022觀影記錄",message: "萬物方來,萬物方去,永遠(yuǎn)的轉(zhuǎn)著存在的輪子",imgRes: imgs));
    isLoading = false;
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    getSuggestInfo();
  }

在實際用切換的過程中發(fā)現(xiàn)每次切換到推薦頁面時都會進(jìn)行API請求民效,因為我們將API請求寫在了initState函數(shù)中隘击,為了讓頁面的狀體持久化,我們可以添加

class SuggestPageState extends State with AutomaticKeepAliveClientMixin
  @override
  bool get wantKeepAlive => true;

這樣就可以保持頁面狀態(tài)研铆,在Tab來回切換時不會多次call API

歡迎關(guān)注Mike的簡書

Android 知識整理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埋同,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棵红,更是在濱河造成了極大的恐慌凶赁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆甜,死亡現(xiàn)場離奇詭異虱肄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)交煞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門咏窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人素征,你說我怎么就攤上這事集嵌。” “怎么了御毅?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵根欧,是天一觀的道長。 經(jīng)常有香客問我端蛆,道長凤粗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任今豆,我火速辦了婚禮嫌拣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呆躲。我一直安慰自己异逐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布歼秽。 她就那樣靜靜地躺著应役,像睡著了一般情组。 火紅的嫁衣襯著肌膚如雪燥筷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天院崇,我揣著相機(jī)與錄音肆氓,去河邊找鬼。 笑死底瓣,一個胖子當(dāng)著我的面吹牛谢揪,可吹牛的內(nèi)容都是我干的蕉陋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼拨扶,長吁一口氣:“原來是場噩夢啊……” “哼凳鬓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起患民,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤缩举,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匹颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仅孩,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年印蓖,在試婚紗的時候發(fā)現(xiàn)自己被綠了辽慕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赦肃,死狀恐怖溅蛉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情他宛,我是刑警寧澤温艇,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站堕汞,受9級特大地震影響勺爱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讯检,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一琐鲁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧人灼,春花似錦围段、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灸芳,卻和暖如春涝桅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烙样。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工冯遂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谒获。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓蛤肌,卻偏偏與公主長得像壁却,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裸准,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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