为抗击新肺炎贡献一份技术力量-App研发

14,585 阅读3分钟

推荐学习项目

flutter相关

Log

  • 2020.2.2 - 修复了统计的分隔符导致统计数据无法正常显示。

App体验

Android 下载地址:

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

Android(二维码下载):

download.png

IOS: 拉下代码直接跑即可

开头

这段时间肺炎比较严重,大家记得戴口罩

大家好,我又来蹭热点了。

1.26日02:00看到了:

从而有了这篇文章。

感同深受:

我不是什么专业人士,也无法贡献医疗力量,只能尽我所能看是否能为这件事做一点点的贡献。

还有就是始终无法劝动父母戴口罩,我爸今天还打牌到凌晨2点左右才回来,他去之前我都跟他约定好了,我不去网吧上网了,他也别去打牌了,并讲述了这次疫情的重要性, 无果。

资讯来源:

App内所有资讯来自人民日报和丁香医生,官方实时动态更新,经验证。

介绍

本次App研发主要采用dart语言,flutter框架,MVVM架构设计,采用上文提供的接口进行开发,代码非常简洁可观,注释明确。

App页面

home.pngrumor1.pngrumor2.pngrumor3.png
protect1.pngprotect2.pngprotect3.pnglore.png

项目结构

MVVM架构设计

封装了请求Model和ViewModel;

  • 请求Model示例:
  • ViewModel示例:
  • JsonModel:

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.cn/post/684490…

关于项目

项目在不断更新,目前架构和请求等数据处理方式已封装完毕。

正在进行View层和推送的开发。

接口作者(普通程序员)也在不段优化和更新,在此致敬!

项目地址

App项目:
接口项目:

意见反馈

如果大家有好的意见或者有好的设计图的话可以群内找我。

Flutter交流QQ群:874592746