GetX系列教程---新聞案例

前言

在前面的文章中我們對GetX的基礎知識進行了講解,包括狀態(tài)管理仰挣、路由管理伴逸、依賴管理國際化等膘壶。

今天我們來將一個小案例用于結合前面學習的知識做一個總結错蝴,這個案例主要是講解網絡數(shù)據請求模型處理颓芭、GetXController顷锰,用MVC模型來實現(xiàn)。

視頻教程地址

零基礎視頻教程地址

請求網絡數(shù)據

我們新建一個ApiService.dart用于請求網絡數(shù)據亡问,該數(shù)據是一個新聞列表的數(shù)據。


import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:flutter_getx_example/GetXApiDataExample/MovieModule/Models/MovieModel.dart';

class ApiService {

  static Future<List<MovieModel>> fetchMovie() async {
    var response = await Dio().get("http://apis.juhe.cn/fapig/douyin/billboard?type=hot_video&size=50&key=9eb8ac7020d9bea6048db1f4c6b6d028");
    if (response.statusCode == 200) {
      var jsonString = response.data['result'];
      return movieModelFromJson(json.encode(response.data["result"]));
    }
  }

}

定義模型類

我們新建一個MovieModel.dart用來對網絡請求回來的數(shù)據進行模型轉換慎框。

// To parse this JSON data, do
//
//     final movieModel = movieModelFromJson(jsonString);

import 'dart:convert';

List<MovieModel> movieModelFromJson(String str) => List<MovieModel>.from(json.decode(str).map((x) => MovieModel.fromJson(x)));

String movieModelToJson(List<MovieModel> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class MovieModel {
  MovieModel({
    this.title,
    this.shareUrl,
    this.author,
    this.itemCover,
    this.hotValue,
    this.hotWords,
    this.playCount,
    this.diggCount,
    this.commentCount,
  });

  String title;
  String shareUrl;
  String author;
  String itemCover;
  int hotValue;
  String hotWords;
  int playCount;
  int diggCount;
  int commentCount;

  factory MovieModel.fromJson(Map<String, dynamic> json) => MovieModel(
    title: json["title"],
    shareUrl: json["share_url"],
    author: json["author"],
    itemCover: json["item_cover"],
    hotValue: json["hot_value"],
    hotWords: json["hot_words"],
    playCount: json["play_count"],
    diggCount: json["digg_count"],
    commentCount: json["comment_count"],
  );

  Map<String, dynamic> toJson() => {
    "title": title,
    "share_url": shareUrl,
    "author": author,
    "item_cover": itemCover,
    "hot_value": hotValue,
    "hot_words": hotWords,
    "play_count": playCount,
    "digg_count": diggCount,
    "comment_count": commentCount,
  };
}

使用控制器對數(shù)據進行處理

我們對請求回來的網絡數(shù)據轉化為Model严嗜,并在請求前增加一個loading,當網絡數(shù)據請求回來的時候關閉loading渗常,我們來看一下代碼


import 'package:flutter_getx_example/GetXApiDataExample/ApiModule/ApiService.dart';
import 'package:flutter_getx_example/GetXApiDataExample/MovieModule/Models/MovieModel.dart';
import 'package:get/get.dart';

class MovieController extends GetxController {

  var isLoading = true.obs;
  // ignore: deprecated_member_use
  var movieList = List<MovieModel>().obs;

  @override
  void onInit() {
    // TODO: implement onInit
    fetchMovie();
    super.onInit();
  }

  void fetchMovie() async {
    try {
      isLoading(true);
      var movie = await ApiService.fetchMovie();
      if (movie != null) {
        movieList.assignAll(movie);
      }
    } finally {
      isLoading(false);
    }
  }
}

在視圖層展示列表數(shù)據

前面我們對網絡請求、模型踢俄、數(shù)據處理進行了處理抗俄,我們最終的目的是需要把數(shù)據展示到頁面上跟压,那我們接著來看一下視圖的代碼

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/GetXApiDataExample/MovieModule/Controller/MovieController.dart';
import 'package:get/get.dart';

class MovieListView extends StatelessWidget {

  final MovieController movieController = Get.put(MovieController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Movie"),
      ),
      body: Obx(() {
        if (movieController.isLoading.value) {
          return Center(
            child: CircularProgressIndicator(),
          );
        } else {
          return ListView.builder(
            itemCount: movieController.movieList.length,
            itemBuilder: (context, index) {
              return Column(
                children: [
                  Row(
                    children: [
                      Container(
                        width: 100,
                        height: 120,
                        margin: EdgeInsets.all(10),
                        child: ClipRRect(
                          borderRadius: BorderRadius.circular(6),
                          child: Image.network(
                            movieController.movieList[index].itemCover,
                            width: 150,
                            height: 100,
                            fit: BoxFit.fill,
                            // color: Colors.orange,
                            // colorBlendMode: BlendMode.color,
                          ),
                        ),
                      ),
                      Flexible(
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.start,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(
                              movieController.movieList[index].author,
                              style: TextStyle(
                                color: Colors.black45,
                                fontSize: 16
                              ),
                            )
                          ],
                        ),
                      ),
                    ],
                  ),
                  Container(
                    color: Colors.grey.shade300,
                    height: 2,
                  )
                ],
              );
            },
          );
        }
      }),
    );
  }

效果展示

image

總結

該案例中最重要的通過繼承自GetxController分離了UI業(yè)務邏輯倔监,并通過Get.put對控制器進行了實例化济丘,然后使用Obx對數(shù)據進行了一個狀態(tài)刷新疟赊。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末椅挣,一起剝皮案震驚了整個濱河市靠抑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肌似,老刑警劉巖固额,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑟捣,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機率拒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門热康,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奕锌,“玉大人,你說我怎么就攤上這事。” “怎么了屹逛?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵蝶念,是天一觀的道長摔敛。 經常有香客問我疫萤,道長尾序,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上继榆,老公的妹妹穿的比我還像新娘鞠苟。我一直安慰自己跨细,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布痢缎。 她就那樣靜靜地躺著蛇捌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪车要。 梳的紋絲不亂的頭發(fā)上悉患,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音烹玉,去河邊找鬼装获。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的黎烈。 我是一名探鬼主播状植,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼暖途,長吁一口氣:“原來是場噩夢啊……” “哼驻售!你這毒婦竟也來了迟几?” 一聲冷哼從身側響起蚜枢,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤莽鸭,失蹤者是張志新(化名)和其女友劉穎姥闭,沒想到半個月后丹鸿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡棚品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年靠欢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜跑。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡门怪,死狀恐怖,靈堂內的尸體忽然破棺而出锅纺,到底是詐尸還是另有隱情掷空,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布囤锉,位于F島的核電站拣帽,受9級特大地震影響,放射性物質發(fā)生泄漏嚼锄。R本人自食惡果不足惜减拭,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望区丑。 院中可真熱鬧拧粪,春花似錦修陡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癣朗,卻和暖如春拾因,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旷余。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工绢记, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人正卧。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓蠢熄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炉旷。 傳聞我的和親對象是個殘疾皇子签孔,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容