為抗擊新肺炎貢獻一份技術力量-App研發

CrazyQ1發表於2020-01-25

推薦學習專案

flutter相關

Log

  • 2020.2.2 - 修復了統計的分隔符導致統計資料無法正常顯示。

App體驗

Android 下載地址:

www.flutterj.com/nCoV-2019.a…

Android(二維碼下載):

download.png

IOS: 拉下程式碼直接跑即可

開頭

這段時間肺炎比較嚴重,大家記得戴口罩為抗擊新肺炎貢獻一份技術力量-App研發

大家好,我又來蹭熱點了。

1.26日02:00看到了:

從而有了這篇文章。

感同深受:

我不是什麼專業人士,也無法貢獻醫療力量,只能盡我所能看是否能為這件事做一點點的貢獻。

還有就是始終無法勸動父母戴口罩,我爸今天還打牌到凌晨2點左右才回來,他去之前我都跟他約定好了,我不去網咖上網了,他也別去打牌了,並講述了這次疫情的重要性, 無果。

資訊來源:

App內所有資訊來自人民日報和丁香醫生,官方實時動態更新,經驗證。

介紹

本次App研發主要採用dart語言,flutter框架,MVVM架構設計,採用上文提供的介面進行開發,程式碼非常簡潔可觀,註釋明確。

App頁面

home.png
rumor1.png
rumor2.png
rumor3.png
protect1.png
protect2.png
protect3.png
lore.png

專案結構

為抗擊新肺炎貢獻一份技術力量-App研發

MVVM架構設計

封裝了請求Model和ViewModel;

  • 請求Model示例:
    為抗擊新肺炎貢獻一份技術力量-App研發
  • ViewModel示例:
    為抗擊新肺炎貢獻一份技術力量-App研發
  • JsonModel:
    為抗擊新肺炎貢獻一份技術力量-App研發

View層暫無,所以還不算完整,待更新

請求封裝

// 請求計數
var _id = 0;

/*
* 請求型別列舉
* */
enum RequestType { GET, POST }

class ReqModel {
  ///連線超時時間為5秒
  static const int connectTimeOut = 5 * 1000;

  ///響應超時時間為7秒
  static const int receiveTimeOut = 7 * 1000;

  // 請求url路徑
  String url() => null;

  // 請求引數
  Map params() => {};

  /*
  * get請求
  * */
  Future<dynamic> get() async {
    return this._request(
      url: url(),
      method: RequestType.GET,
      params: params(),
    );
  }

  /*
  * post請求
  * */
  Future post() async {
    return this._request(
      url: url(),
      method: RequestType.POST,
      params: params(),
    );
  }

  /*
  * post請求-檔案上傳方式
  * */
  Future postUpload(
    ProgressCallback progressCallBack, {
    FormData formData,
  }) async {
    return this._request(
      url: url(),
      method: RequestType.POST,
      formData: formData,
      progressCallBack: progressCallBack,
      params: params(),
    );
  }

  /*
  * 請求方法
  * */
  Future _request({
    String url,
    RequestType method,
    Map params,
    FormData formData,
    ProgressCallback progressCallBack,
  }) async {
    Dio _client;

    final httpUrl = '$reqUrl$url';

    if (_client == null) {
      BaseOptions options = new BaseOptions();
      options.connectTimeout = connectTimeOut;
      options.receiveTimeout = receiveTimeOut;
      options.headers = const {'Content-Type': 'application/json'};
      options.baseUrl = reqUrl;
      _client = new Dio(options);
    }

    final id = _id++;
    int statusCode;
    try {
      Response response;
      if (method == RequestType.GET) {
        ///組合GET請求的引數
        if (mapNoEmpty(params)) {
          response = await _client.get(
            url,
            queryParameters: params,
          );
        } else {
          response = await _client.get(
            url,
          );
        }
      } else {
        if (mapNoEmpty(params) && formData.isNotEmpty) {
          response = await _client.post(
            url,
            data: formData ?? params,
            onSendProgress: progressCallBack,
          );
        } else {
          response = await _client.post(
            url,
          );
        }
      }

      statusCode = response.statusCode;

      if (response != null) {
        print('HTTP_REQUEST_URL::[$id]::$httpUrl');
        if (mapNoEmpty(params)) print('HTTP_REQUEST_BODY::[$id]::$params');
        print('HTTP_RESPONSE_BODY::[$id]::${json.encode(response.data)}');
        return response.data;
      }

      ///處理錯誤部分
      if (statusCode < 0) {
        return _handError(statusCode);
      }
    } catch (e) {
      return _handError(statusCode);
    }
  }

  ///處理異常
  static Future _handError(int statusCode) {
    String errorMsg = 'Network request error';
    Map errorMap = {"errorMsg": errorMsg, "errorCode": statusCode};

    print("HTTP_RESPONSE_ERROR::$errorMsg code:$statusCode");
    return Future.value(errorMap);
  }
}
複製程式碼

關於介面

帶引數例子:

來自普通程式設計師, 連結:juejin.im/post/5e2c6a…

關於專案

專案在不斷更新,目前架構和請求等資料處理方式已封裝完畢。

正在進行View層和推送的開發。

介面作者(普通程式設計師)也在不段優化和更新,在此致敬!

專案地址

App專案:
介面專案:

意見反饋

如果大家有好的意見或者有好的設計圖的話可以群內找我。

Flutter交流QQ群:874592746

Flutter交流微信群:

為抗擊新肺炎貢獻一份技術力量-App研發

相關文章